(Думаю, термин «инжекторная эмуляция» здесь будет кстати…)
- Функция эмуляции процессора дополнена сигналом «Fetch» - аналогом цикла «M1»
- Функция эмуляции памяти дополнена условием Fetch-проверки, чтобы перехватывать коды псевдо-префиксов на псевдо-аппаратном уровне
- Процедура ассемблера дополнена дополнительными инструкциями для поддержки псевдо-префиксов
Наткнувшись в очередной раз на заметку (ссылка / цитата) на семь бессмысленных команд процессоров i8080 и z80, решил попробовать сделать набросок схемы для их аппаратного перехвата.
А именно, связка К155СП1 и К155ИР1 следит в цикле M1 процессора за считываемым кодом операции. Если байт кода является одним из набора MOV-инструкций с холостой пересылкой, то он ИМС СП1 его выявляет и сигнализирует ИМС ИР1 о его регистрации. Сам процессор эти коды отрабатывает как обычно, но схема страничной памяти на следующей инструкции при доступе к памяти подставит дополнительный банк памяти размером до 448 Кб.
- Код 40 / команда «MOV B,B» - префикс #6: Адресация 60000…6FFFF
- Код 49 / команда «MOV C,C» - префикс #7: Адресация 70000…7FFFF
- Код 52 / команда «MOV D,D» - префикс #4: Адресация 40000…4FFFF
- Код 5B / команда «MOV E,E» - префикс #5: Адресация 50000…5FFFF
- Код 64 / команда «MOV H,H» - префикс #2: Адресация 20000…2FFFF
- Код 6D / команда «MOV L,L» - префикс #3: Адресация 30000…3FFFF
- Код 76 / команда «HLT» - префикс #0 (по умолчанию): Адресация 00000…0FFFF
- Код 7F / команда «MOV A,A» - префикс #1: Адресация 10000…1FFFF
В ассемблере появился набор инструкций для работы с дополнительными банками памяти:
- Код 7F+02 / команда «STAX B1» - запись в страницу 10000…1FFFF
- Код 64+1A / команда «LDAX D2» - чтение из страницы 20000…2FFFF
- Код 6D+6E / команда «MOV L,M3» - чтение из страницы 30000…3FFFF
- Код 52+77 / команда «MOV M4,A» - запись в страницу 40000…4FFFF
- Код 5B+96 / команда «SUB M5» - вычитание байта страницы 50000…5FFFF
- Код 40+C1 / команда «POP B6» - стековое извлечение из страницы 60000…6FFFF
- Код 49+D5 / команда «PUSH D7» - стековая запись в страницу 70000…7FFFF
- Код 7F+E3 / команда «XTHL1» - стековый обмен со страницей 10000…1FFFF
- имеются побочные команды «RET1…7» и т.п.
Написан экспериментальный код:
- Редактор дампа с доступом к дополнительным банкам с простейщим механизмом отладки через исполнение одной инструкции
- Набросок файловой системы с форматом ORDOS для поиска и хранения файлов в дополнительных банках под именами псевдо-дисков «A: B: C: D: E: H: L:»
- Набросок игрового поля с графикой и цветом
- Механизм поддержки перегружаемого знакогенератор и тайлов
На практике выяснилось, что доступ к дополнительным банкам - статический (код страницы указывается непосредственно префиксов) и требует некоторых программных механизмов для динамического доступа (в редакторе дампов и файловой системе).
Так, для обеспечения виртуальной инструкции «MOV A,M#» для чтения из произвольной страницы (диска), сначала необходимо поместить код конкретной инструкции (7F+7E / 64+7E / 6D+7E / 52+7E / 5B+7E / 40+7E / 49+7E) в память (аналогично как директива G Монитора с записью кода инструкции JMP непосредственно в служебную область), чтобы обращаться к теневым банка посредством CALL-вызовов, что не очень практично…
Дескрипторы
Гораздо более гибкий способ с обеспечением памяти до 1 Мб - 16 Мб может предоставить более затратная доработка, где префиксы работают как дескрипторы страниц (аналогично как x86-сегментs CS: DS: ES: SS: FS: GS:), где из набора дескрипторов в 512 Кб можно разворачивать память до 16 Мб перенастройкой семи регистров, закреплённых за префиксами.
Знакогенератор КОИ7 и КОИ8
В очередной раз внимательно вчитываясь в официальную документацию по ИМС i8275, внимание привлекли коды E4 и E5, которые должны вентильной добавкой (довольно неудобной на практике) формировать, так называемые, символы рамок. Причём, в отличии от универсальных атрибутов с ограничением количества до 16 на строку, символы рамок не имеют ограничения на их количество в строке и не сбивают цикл ПДП, являясь как бы отображаемыми символами.
Именно два кода E4 и E5 выставляют на выводе LA0 ВГ75 устойчивый логический "1" на всю высоту знакоместа. Причём, вывод HLGT ВГ75, управляющий яркостью отображения, локально, на период отображения символа "рамки" может быть как выключеным (код E4), так и включён (кодом E5).
Если добавить пару вентилей и триггер ТМ2, можно обеспечить переключение с основного знакогенератора РК - КОИ7-С, на дополнительный знакогенератор - КОИ8:
- Набор КОИ7 включается всегда в начале строки сигналом HRTC и сбросом дополнительного ТМ2
- Код E4 выставит LA0 и разрешит поступление тактовых импульсов через вентиль на ТМ2. Первый триггер установится в "1" и переключит ПЗУ в режим ASCII с латиницей заглавных и строчных литер
- Код E5 выставит LA0 и разрешит поступление тактовых импульсов через вентиль на ТМ2. Первый триггер установится в "1" вместе со вторым триггером, переключив ПЗУ на набор КОИ8 с кириллицей заглавных и строчных литер с символами псевдографики
Это позволяет в одном слове иметь нормальную смесь заглавных и строчных литер одного из алфавитов, что более естественнее и красивее, чем разделить знакогенератор на половину заглавных и половину строчных литер двух алфавитов.
Схема с доработкой - ниже.
- Элемент D13.1 ТМ2 после сигнала сброса устанавливается теперь не по сигналам A15+DBIN, а просто по фронту сигнала A15 (спорный момент и требует проверки), освободив этим вентиль D10.1
- Элемент D10.1 ЛА3 теперь подключён к ИД7 вместо D5.3 ЛП5
- Элементы D10.1 и D10.4 подключены к D11 ИД7 перекрёстно и выборка основного банка ОЗУ производится по адресам 0000…1FFF и 6000…7FFF (дополнительное ОЗУ займёт адреса 2000…5FFF), что позволит использовать ПЗУ «Монитор» на 32 Кб и запустить многие игровые программы, расчитанные на 32 Кб (потому принцип расключения самого ИД7 не был затронут: выборка 8 страниц по 8 Кб)
- Используются ИМС К573РФ4 за ПЗУ D12 знакогенератора и D17 «Монитора»
- Элемент D5.3 ЛП5 теперь используется для инверсии видеосигнала по сигналу RVV атрибута ИМС D8 ВГ75 (перемычка «JP» - опциональна)
- Добавлены ИМС ЛИ1 и ТМ2 с управлением сигналами LA0 и HLGT ИМС D8 кодами E4/E5 буфера экрана для выборки дополнительных таблиц знакогенератора
- ИМС D21 К140УД6 удалён с основной части схемы и перенесён на плату клавиатуры (оригинальная схема клавиатуры РК идеально подходит и для подключения джойстика к линии клавиш управления курсором, что позволило бы на плате клавиатуры разместить два дополнительных разъёма: Джойстик и Магнитофон)
- Если удалить два ППА ВВ55 D14 и D20 с основной платы и перенести D20 на плату клавиатуры, соединяющий шлейф сократится на восемь линий и освободится место на процессорной плате (возможно, понадобятся дополнительные буферы шин, чтобы поддержать функционирование ВВ55 удалённого на клавиатуру)