nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 22 Sep 2018 11:44



Reply to topic  [ 1 post ] 
Аппаратный эмулятор ZX на ОРИОНЕ 
Author Message
Senior
User avatar

Joined: 19 Feb 2017 04:46
Posts: 151
Location: Россия
Reply with quote
Отвечу здесь на пост отсюда.

error404 wrote:
- вводится NMI 50Гц в противофазе к прерыванию по КСИ из Z80Card-II
- по NMI 25 раз в секунду перекодируется ч/б экран.

Про эмулятор ZX на Векторе я узнал только недавно. Эмулятор ZX на Векторе имеет совсем иной алгоритм, - там экран не требуется визуализировать, он виден и так. Для чего родной экран Вектора аппаратно перекорёживают под ZX путём разрезов печати и цвет делают как у ZX. По NMI требуется эмулировать только клавиатуру.

А я сделал эмулятор с визуализацией экрана на NMI, а клавиатуру наоборот использовал оригинальную. Конструкция - внешняя платка, без разрезов печати основной платы и доработка в целом проще.

Первым эмулятор ZX на ОРИОНЕ сделал С.Караваев летом 1993 в своей первой плате ОРИОНА 5 МГЦ. Осенью 1993 он не смог мне продемонстрировать работу своего эмулятора, - думаю, что на плате был лишь, возможно даже неотлаженный макет, т.к программной поддержки не было.

Я этим занялся пару лет спустя, когда популярность ОРИОНА резко упала. И без труда получил полностью рабочую версию такого эмулятора, правда только монохромную. Но это не важно, я хотел лишь проверить реализуемость идеи.

Разработка оказалась предельно простой. Никаких сложностей вообще не было, заработало сразу же. Всего за один день получил эмулятор в котором работал ПЗУ-ушный ZX-бейсик. Хотя пришлось трахаться ещё день, чтобы добиться загрузки с МГ-ленты.

Программа обслуживания была очень маленькая, всего пол килобайта. Скорость прогона при той частоте визуализации и монохроме, что я использовал была заметно выше, чем на реальном ZX (хотя можно было, вводя паузы, подогнать скорость прогона). Я использовал нерегулируемый период визулизации в 6 герц, при этом мельканий на экране не заметил. Даже при трёх FPS искажений не было, лишь задержка. Cкорость ОРИОНА была 3.9 МГЦ (вариант турбо 1.42 и кварц 10.5 МГЦ).

Всего в конструкции было 6 TTL микросхем (и ещё несколько, если нужен джойстик). Клавиатура не эмулировалась, а подключалась оригинальная ZX-матрица в 40 клавиш. Схема сохранилась, хотя возможно немного не точная. Но идея из схемы ясна. СтоИт счётчик делитель на 16 считающий импульсы 50 ГЦ (то, что раньше шло на вход INT, теперь эти же импульсы на INT идут через ключ ЛЛ1).

При появлении единицы на этом выходе счётчика (с весом 8), управляемый этим сигналом импульс 50 ГЦ поступал не на вход INT, а на вход NMI. Эта же единица поступает на R вход триггера (разрешая взвод по S). И когда на R единица, то по сигналам /M1 и /IORQ равным 0 (объединённых на ЛЛ1 и поданных на S) взводится триггер RNMI. Т.е этот триггер RNMI взводится ровно в момент начала обработки NMI. Судя по схеме этот триггер нужен, чтобы отключать на время обслуживания NMI защиту области 0...3FFF от записи.

Во время прогона программы ZX запись в ОЗУ в окне 0...3FFF запрещается запретом прохождения сигнала /WR. Запрет делает второй триггер (порт FB/D4). Взвод второго триггера по C разрешён, когда первый триггер RNMI в 0. А этот второй триггер как раз и является однобитовым портом по биту D4 порта FB. Потому программа перед началом эмуляции записывает в порт FB/D4 единицу, что запрещает запись в ОЗУ 0...3FFF. А в начале обслуживания NMI взводом первого триггера порт FB/D4 автоматически сбрасывается в 0 разрешая запись в окно 16К.

По прерыванию NMI команда на адресе 66H делает JMP в конец ZX-ПЗУ, где свободно более килобайта. Там стоит процедура переключающая конфигурацию и в окне 0...3FFF включается сегмент экрана ОРИОНА. Там 12 кб эанимает экран и 4 кб остаётся для кода визуализации. Программа обслуживания NMI запрещает прерывания, т.к время копирования экрана больше, чем 20 МС, а INT в это время не нужен. После конца визуализации снова в окне 16К включается страница с ПЗУ ZX, по STA FB00 сбрасывается счётчик, 0 на выходе счётчика сбрасывает первый триггер RNMI, а 0 на его выходе сбрасывает триггер порта FB/D4, включая защиту от записи, и из кода ZX-ПЗУ делается RETI.

С частотой 25 ГЦ визуализировать экран в цвете скорее всего не получится, - скорости Z80 не хватит. Но может быть 10 ГЦ, - получится. Если не использовать готовую, а эмулировать ZX-клавиатуру, то действительно надо иметь такт NMI в 25-50 Гц, делая визуализацию не по каждому NMI, а с FPS 6-12 ГЦ (сколько хватает ресурса скорости).

Таким образом сделать аппаратный эмулятор ZX на ОРИОНЕ с Z80CARD-II это вообще не проблема, т.к эта архитектура идеально подходит для этого. Причём схему и алгоритм ещё можно оптимизировать до 4-5 корпусов.

А вот на ЭВМ, где нет коммутируемого окна ОЗУ 0...3FFF размером в 16 кб и режима FULL RAM, всё будет сложнее, - придётся экран переставленный на 0, закрывать ПЗУ с кодом ПЗУ ZX, а также решать проблему, чтобы было ОЗУ до FFFF.

На Специалисте на РУ5 экран придётся оставить на 9000, т.к в Специалисте экран сдвинут на 1000 от начала сегмента 16К, и при переносе его под ZX-ПЗУ, свободная в ZX-ПЗУ область 386E...3CFF окажется в экране. Потому экран оставляем на 9000, закрывая его на время куском ОЗУ из под ПЗУ 0...3FFF. Тогда процедуру обслуживания NMI можно разместить как в свободном месте ZX-ПЗУ, так и в ОЗУ 8000...8FFF.

С учётом того, что нужна клавиатура ZX и некоторые игры из-за разницы времянок будут с искажениями, практически нет смысла в такой конструкции. Но "just for fun" можно сделать, тем более, что это просто.


05 May 2018 21:07
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 1 post ] 

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.