Вот мыслеизложение
Думал я тут немного какой команды не хватает Z80? И вот придумал не хватает катострафически команд межсегментного перехода, а потом подумал а можно ли без медленных протонов изменить кристалл процессора, оказывается можно :) необходимо доделать всего лишь ULA. Суть задумки заключается в использовании очень умной команды LD B,B. Именно благодаря ее изумительным интеллектуальным свойствам невозможное становится былью.
Работать это будет так
Команда межсегментного перехода JP 34:FC00 в интерпретации ассемблера будет выглядеть так
LD B,B DB #34 JP #FC00
Заманчиво? Особенно если рассмотреть вариант под корректировки транслятора. A ULA будет делать следующие шаги
1. LD B,B ага команда межсегментного перехода, ну скормим ее процессору
2. DB #34 вот эта интересующая нас страничка запомним ее а процессору скормим команду NOP
3. JP #FC00 а вот эту команду мы тоже скормим процессору
4. Теперь ждем цикла M1 и когда он выступить сменим страничку на запомненную
Просто?
Дальше подумал переход это хорошо, но как-то не алгоритмично получается, надо бы вызов в подпрограмму и возврат сделать
CALL 34:FC00 и RETF призовем на помощь великие и могучие команды LD C,C и LD D,D
Итак рассмотрим команду CALL 34:FC00 будет это дело у нас интерпретироваться так
LD C,C DB #34 CALL #FC00
Рассмотрим, что будет делать ULA
1. LD C,C ага команда межсегментного перехода, скормим ее
2. DB #34 запомним номер странички а процессору скормим команду PUSH HL
3. Процессор ничего не подозревая выполняет команду PUSH HL а мы в этот момент подло его отключаем от шины данных и выставляем туда по очереди #0034 :)
4. CALL #FC00 скормим ее процессору
5. Ждем цикла M1 и по наступлению меняем номер страницы
Осталась самая подлая команда RET на время ее исполнения придется намертво отключить все виды прерываний.
LD D,D POP HL RET
1. LD D,D ага команда межсегментного возврата, скормим ее
2. POP HL скормим и эту команду
3. Во время выполнения этой команды мы запомним младшую половину читаемого по шине слова где то внутри ULA
4. RET скормим ее процессору
5. Ждем цикл M1 и меняем номер странички
Вот так. Но есть одно но в каждой процедуре которая имеет тип FAR (тобиш вызывается командой межсегментного вызова подпрограммы), должна иметь шапку которая меняет местами два слова на вершине стека (это чтобы работала команда длинного возврата), но я думаю можно поплатиться за такую расширяемость программного обеспечения и фактически можно вызывать процедуры в пределах 4Мб, почему 4? А потому что старшие два бита адреса всегда установлены в 1 и фактически не участвуют в адресации получаем (8+14)^2 =4Мб . А почему старшие два бита 1, а потому что окно проецирования дополнительной памяти располагается по адресам #C000-#FFFF и имеют общее свойство два старших бита такие как упоминалось выше
Вердикт?
PS Можно расмотреть еще две команды это переключение страницы LD E,E DB #34 и переключение страницы на время исполнения одной команды LD H,H #34 своеобразный префикс замещения сегмента.
И еще одну LD (HL),(HL) назовем ее HALT и пусть она останавливает процессор :)

