
Сообщение от
ewgeny7
Готов диспетчер памяти. Расклад таков (мало ли я неправильно понял идею):
В младшее окно памяти 0-3FFF впечатываем любой сегмент памяти 16кб, в зависимости от битов 0 и 1 порта FB. При этом в странице 0 сегменты впечатываются при условии, что бит 2 порта FB равен 0. Если же он равет 1, то "миксуются" сегменты в странице 1, при этом в странице 0 всё находится в своем изначальном положении. Проверял работу диспетчера в Мониторе.
Вот, высказался. Аж вспотел

Чего-то я нифига не понял, но смутно ощущаю какую-то неправильность. 
Изложу моими словами. Итак, что вообще известно про порт FB (про прерывания не пишу):
Код:
Порт FB - УПРАВЛЕНИЕ ПРЕРЫВАНИЯМИ И ДИСПЕТЧЕРОМ:
D7 D6 D5 D4 D3 D2 D1 D0
! ! ! ! ! ! ! !
MZ INT XMEM RZRV BS1 BS0 SS1 SS0
! ! ! ! ! ! ! !
! ! ! ! ! ! !______!____ SEGMENT SELECT
! ! ! ! !______!__________________ BANK SELECT
! ! ! !
! ! ! !________ РЕЗЕРВ ДЛЯ BANK SELECT (ВСЕГДА = 0)
! ! !_______________ FULL RAM MEMORY (ПРИ D5=1 0-FFFF - ОЗУ)
! !______________________ INT ENABLE (ПРИ D5=0 ЗАПРЕЩЕНЫ)
!_____________________________ DISPATCHER OFF (ПРИ D7=1 ОТКЛЮЧЕН !)
БИТЫ BS1,BS0 ОПРЕДЕЛЯЮТ НОМЕР БАНКИ ОЗУ, А БИТЫ SS1,SS0 ОПРЕДЕЛЯЮТ КАКОЙ
16-ТИ КИЛОБАЙТОВЫЙ УЧАСТОК ИЗ ЭТОЙ БАНКИ БУДЕТ ДОСТУПЕН ПО АДРЕСАМ 0-3FFF.
Биты D0..D3 - фактически обычный шестнадцатиричный 4-битный номер 16-k сегментa в пространстве первых 256k ОЗУ (0,1,2,3,4,...,14,15) - сегмента, включаемого в окне 0000...3FFF (если по начальному адресу - это сегменты 0:0000, 0:4000, 0:8000, 0:C000, 1:0000,...,3:8000, 3:C000 соответственно). Окно 0000...3FFF лучше рассматривать как кусок адресного пространства процессора куда что-то проецируется. Т.е. без привязки к 60к-страницам памяти, т.к. 16к и 60к диспетчеры работают независимо друг от друга как физически, так и "в понятиях".
бит D4 пока никак не используем
Если включен дипетчер 16к (если бит D7 порта FB =0 ! т.е. инверсно), то в адресное пространство Z80 в диапазоне 0...3FFF попадает 16-к сегмент адресуемый как я описал выше, в адресное пространство 4000...EFFF попадает та страница ОЗУ, номер которой указан в порте F9.
Если выключен дипетчер 16к (если бит D7 порта FB =1 ! т.е. инверсно), то в адресное пространство Z80 в диапазоне 0...EFFF попадает та страница ОЗУ, номер которой указан в порте F9.
Если бит D5 порта FB =1 (FULL RAM ON), то в в адресное пространство Z80 в диапазоне F000...FFFF попадает область F000...FFFF страницы ОЗУ, номер которой указан в порту F9 (т.е. область F000...FFFF НЕ "СКЛЕЕННАЯ" ). Порты F400..F7FF, F8,F9,FA как память недоступны (недоступны по MREQ, но доступны по IORQ), ПЗУ F800...FFFF - недоступно, вся память - ОЗУ.
Если бит D5 порта FB =0 (FULL RAM OFF, как в стандартном Орионе128), то в в адресное пространство Z80 в диапазоне F000...F3FF независимо от содержимого порта F9 попадает область F000...F3FF физически_ПЕРВОЙ страницы ОЗУ (с номером 0, если считать с нуля), т.е. область F000...F3FF "склеенная" , F400..F7FF, F8,F9,FA - порты (и по MREQ и по IORQ), F800...FFFF - ПЗУ на чтение и порты на запись.
По умолчанию (по RESET и при включении питания) порт FB содержит значение 80h (старший разряд как я уже писал - нормальноинвертированный).
Как-то так...