Эмулятор B2M с конфигом для РУ7, предложенный B2M, не работает как следует.
Диспетчер ОЗУ в окне 8400...BFFF для РУ7 состоит из одной микросхемы КП11, на вход SEL которой заведён адрес A15 от КР580. Такой диспетчер памяти физически работает так.
При обращении CPU к памяти ниже 8000 с помощью КП11 на адреса памяти A15,A16,A17 подаётся 0, а на адрес памяти A14 подаётся A14 от КР580. Этим в адресах 0...7FFF включается самый младший кусок ОЗУ в 32К, образуя основное базовое ОЗУ.
При обращении CPU к памяти выше 8000 с помощью КП11 на адреса памяти A14,A15,A16,A17 подаются разряды PC0...PC3 из ППА по адресу F100. Тем самым в адресах 8000...BFFF включается сегмент размером в 16К, чей номер записан в порт C ППА.
Из-за клавиатуры на 8000, из 16К сегмента видимы только 15К (отступ 400H). Таким образом при записи в ППА числа 0, в окне 8400...BFFF отображается участок 0400...3FFF базового ОЗУ, а при записи в ППА числа 1 в окне 8400...BFFF отображается участок 4400...7FFF базового ОЗУ.
Эмулятор B2M не включает в окне 8400...BFFF сегмент 1 при записи в ППА числа 01. Т.е основное ОЗУ 4400...7FFF в окне 8400 не включается, сегмент не работает как надо. Этот сегмент оказывается как-бы из абстрактного ОЗУ, никак не связанного с общей памятью. Сегмент 00, т.е кусок ОЗУ 0400...3FFF прекрасно включается в окне 8400. А сегмент 01 не включается.
Более того, старшая половина расширенного ОЗУ вообще не работает. Мне пришлось потратить уйму времени и написать кучу тестов, чтобы понять почему программы не работают в эмуляторе так, как следует.
Вот что стоит в конфиге предложенном B2M:
Код:
mem1 : Memory {
size=40000
frame[0].size=8000
frame[0].page=DOPPPA.portC[0-3]
}
Ошибка в том, что шаг управления памятью здесь равен 8000, а надо 4000.
А вот как надо, чтобы получить то, что требовалось:
Код:
mem1 : Memory {
size=40000
frame[0].size=4000
frame[0].page=DOPPPA.portC[0-3]
}
Чтобы убедиться в вышеизложенном достаточно "поставить" в эмуляторе B2M базовое ПЗУ F800 (точнее любое ПЗУ, что не инициализирует порт F102 по WARM BOOT, чтобы можно было менять содержимое порта вручную), записать в F102 число 01, записать директивой M любое число на 4400H и убедиться, что оно не появилось в ячейке 8400. Затем поставьте исправленный конфиг и повторите эксперимент.
Прилагаю тест архитектуры, а также ПЗУ F800 (то же самое, что и раньше, но на 6 байтов больше свободных ячеек).