Имею вопрос к авторам эмуляторов отечественных 8-ми разрядок на Z80.
В процессоре Z80 есть регистр R, служащий для регенерации памяти. К сожалению, эта регенерация памяти ни программно, ни аппаратно не отключается, что возможно ускорило бы Z80. Поэтому при написании эмулятора встаёт вопрос его эмуляции.
В эмуляторах ZX-Spectrum этот регистр безусловно приходится эмулировать, т.к его используют некоторые программы, чтобы защититься от прогона в отладчике. А также некоторые программы используют регистр R как однобитовый флаг, пользуясь тем, что вектор регенерации в динамических ОЗУ (РУ3 и РУ5) семибитовый, отчего бит D7 в регистре R не меняется со временем.
Однако в программах всех отечественных 8-ми разрядок, что изначально построены на базе КР580 и в которые с целью турбирования был установлен процессор Z80 (т.к КР580 не турбируется в силу отсутствия его скоростных вариантов), регистр R не используется, отчего его полная эмуляция необязательна (но бит D7 в регистре R надо эмулировать, это используется).
Неточная эмуляция Z80 в эмуляторах позволяет программно определить прогоняется ли программа в эмуляторе (программном или аппаратном) или же на реальном Z80. Например, в эмуляторе точно не будет соответствия с реалом, если используется схема турбирования с WAIT, есть WAIT для отдельных портов или в системе работает ПДП. Достаточно, по прерываниям 50 Гц установить скорость Z80, например понять, что Z80 работает в режиме Турбо-142%, а затем пользуясь этой информацией проконтроллировать корректность работы регистра R. Так что не составляет труда программно вычислить эмулятор. Кстати, в эмуляторах также обычно несинхронный и неточный период прерываний 50 ГЦ, что также позволяет вычислить эмулятор. Это позволяет защитить ценную программу изначально защищённую форматом МГ-записи от взлома и прогона в эмуляторе.
К сожалению, я не имею инфо о работе регистра R. Когда вводится дополнительный такт /RFSH и инкрементируется R? Вводится ли он вообще в каждой команде Z80 (например IN/OUT), как и сколько их вводится в командах типа LDIR? Зависит ли число вводимых тактов RFSH (после каждого из которых инкрементируется R), от того происходит ли в команде одно обращение к памяти или два (в командах работы со словами).
Как видите, по существу эмуляция регистра R в эмуляторе просто бессмысленна, т.к полного соответствия с реалом всё-равно не достичь и в программах регистр R не используется. Эмуляция регистра R, только бесполезно тормозит эмулятор, не позволяя ему работать на медленной 386-той (не говоря уже о 286). В моём эмуляторе есть ключ 'NO_R', позволяющий странслировать версию, как с эмуляцией регистра R (инкремент R на 1 после прогона любой команды), так и более скоростную версию без R.
Таким образом сам регистр R совершенно бесполезен, а вот сигнал /RFSH можно использовать аппаратно.
Простейший вариант использовать /RFSH - как такт равный примерно десятой части клока Z80. Удобство в том, что этот сигнал пропорционален такту Z80.
Удобно использовать этот сигнал для восстановления режима Турбо. В турбированных ОРИОН-ах при обращении к КНГМД делают аппаратное переключение на НЕТУРБО. В качестве управления используют сигнал HLD (Head Load) из ВГ93. Этот сигнал взводится по первому же обращению к ВГ93 и длится ещё 5 секунд после последнего обращения к ВГ93. Если /RFSH подать на счётчик (на 256), то мы сможем вернуть режим Турбо сразу-же по окончании работы с НГМД, что позволит существенно ускорить обмен с НГМД. Потому что сейчас в CP/M после считывания физ.сектора в дискетный буфер, выполняется пересылка блока в 128 байт на адрес DMA на скорости НЕТУРБО, отчего скорость работы с НГМД 10-ти мегегерцового ОРИОНА такая же, как на базовом ОРИОНЕ. Тогда взвод триггера НЕТУРБО происходит по каждому обращению к ВГ93, а его сброс спустя определённое число команд Z80, отчего пересылка на адрес DMA происходит уже на максимальной скорости.
Ещё полезнее /RFSH, когда нам требуется выдавать короткие импульсы жёстко определённой длины. Например, для программного обмена по линии, короткий нулевой импульс кодирует 0, а длинный 1. Обычно ставят два аналоговых одновибратора АГ3 и взводят их стробами портов. Но это нестабильно и ненадёжно. Проще и более гибко поставить ИЕ7, заведя на его входы предустановки 4 бита от ППА клавиатуры. Тогда для выдачи импульса в линию, записываем его нужную длину в 4 бита ППА и даём строб на какой-то порт. По стробу взводится триггер выдающий 0 в линию, в ИЕ7 происходит загрузка с параллельных входов и взвод триггера одновременно переводит Z80 в WAIT. После чего Z80 стоит, но выдаёт такт /RFSH с стабильным периодом (4 маш.такта), который поступает на вход вычитания ИЕ7. Когда ИЕ7 досчитает до 0, сигнал с его выхода "перенос" сбросит триггер, что окончит импульс в линию и освободит Z80. Т.к предустановку стартового веса счётчика можно программно менять, то получается программно управляемый генератор импульсов, что существенно упрощает аппаратуру скоростной передачи по линии.
Да, большинство игр ОРИОНА имеют низкий игровой аспект. Но всё же есть часть игр, что не уступают в качестве играм ZX-Spectrum. Вот неполный список вполне приличных игр КР580: ALMAZ-3, BATTY, MOON FOX, LODE RUNNER, BUDI, TUTANHAMON, SILENT SERVICE, DTE, MANIC-MINER, JET-SET, THRUSTA, CHRONOS, PSST, XONIX от RK86Сообщение от error404




Ответить с цитированием
Размещение рекламы на форуме способствует его дальнейшему развитию 

