ZXNet эхоконференция «code.zx»


тема: Переключение страниц ПрофПЗУ.



от: Vlad Sotnikov
кому: All
дата: 21 Mar 2001


Привет, All!

Я подготовил сабж для автора эмулятора Z80Stealt.
Однако я подумал, что она будет небезинтересна и
реальщикам, поскольку до сих пор о данной проблеме
ходят лишь слухи и не существует мало-мальски
достоверной информации. Поэтому я надеюсь, что в
ходе обсуждения, проблема переключения страниц
ПрофПЗУ более-менее прояснится.




Извини, что отвечаю тебе так поздно - признаться, твоя
просьба заставила меня достаточно помучаться, чтобы выяснить,
как же все-таки переключаются страницы в ПрофПЗУ. Вначале я
начал копать эмулятор MOA SPM. И напоролся там на команду,
названную им SPM. Она имеет код #ED,#10 - и мне потребовалось
немного времени, чтобы понять, что этот способ не имеет ничего
общего с тем, как переключаются страницы на реальном спеке. А
на реальном Скорпионе все происходит так:

Известно, что для выполнения подпрограмм в дополнительных
страницах используется команда RST #30, которая вызывается при
включенном ПЗУ Монитора и 8-й странице. При этом она имеет
следующий формат:
RST #30
DW адрес подпрограммы
DB номер страницы (0...15)
...

После выполнения подпрограммы снова включается основная
страница монитора, и 8-я банка памяти. Hомера страниц имеют
следующие соответствия:

0 - 128 ПЗУ.
1 - 48 ПЗУ.
2 - Монитор (основная страница)
3 - TR-DOS.
...

С 4 по 15 - дополнительные страницы Монитора. Hо это все
внешний уровень. Чтобы узнать, что же происходит на самом деле,
я последовал за RST #30. Там управление передается в 8-ю
страницу, и помещается собственно подпрограмма переключения
страниц ПЗУ, причем очень запутанная. При желании можно ее
посмотреть, но вот тот конечный результат, который я получил из
анализа этого путанного кода MOA.

Вся память ПрофПЗУ делится на определенное количество
сегментов, в каждом из которых находится по 4 страницы. В
ПрофПЗУ 27010 таких сегментов 2, в 27020 - 4 и в Пзу 27040
вероятно тоже 4 сегмента, но основные страницы там
продублированы. Однако это ни что иное, как догадка.
Я копал ПЗУ 27020, и поэтому описываю имеющиеся в нем 4
сегмента. Как все происходит в других ПЗУ, я точно не знаю.
Внутри каждого сегмента страницы переключаются стандартным для
них способом - через порты #1FFD,#7FFD и обращением к адресу
#3D30 (sic у MOA!) для 3-й страницы сегмента. То есть,
допустим, 7-я страница ПЗУ, которой соответствует 3-я страница
1-го сегмента, включается помещением адреса подпрограммы на
стек и обращением к ней по адресу #3D30, где у нее стоит
команда RET. И, наконец, самое главное: каким образом
происходит переключение сегментов. Для этого необходимо считать
значение из определенного участка памяти при включенном ПЗУ
Монитора, т.е. при установленном 1-м бите порта #1FFD. Вот
адреса для этих сегментов:

0 - #0100
1 - #010C
2 - #0108
3 - #0104

Старшее значение - #01. Младшие значения адреса в памяти для
переключения сегментов находятся опять-таки в основной странице
Монитора по адресу #0110. Для получения младшего значения
адреса необходимо к числу #0110 прибавить номер сегмента. Этот
абзац я написал для того, чтоб ты мог посмотреть, какие адреса
соответствуют сегментам в других версиях ПрофПЗУ (27010 и
27040). Хочу заметить, что прошивка ПрофПЗУ 27040 (512К),
которая ходит по сети, скорее всего битая. Однако ты вроде бы
мне об этом уже писал.

Как это не пародоксально, но такое переключение страниц -
факт. Убедится в этом можно, написав такую подпрограммку:

DI
LD BC,#1FFD
LD A,#12
OUT (C),A

LD A,(#010C)

LD BC,#1FFD
XOR A
OUT (C),A
EI
RET

И компьютер уходит в ступор. Теперь что касается прошивки
ПЗУ: к сожалению, у меня ее нет. Hо для эмулятора я бы
порекомендовал использовать прошивку ПрофПЗУ 27010, поскольку
все эти дополнительные программы, сидящие в ROM памяти, страшно
допотопные и никому на фиг не нужны - никто из реальщиков
практически никогда их не запускает. В принципе прошивку можно
выдернуть программно с реального спека таким образом:


ORG #7000

DI
LD BC,#1FFD
LD A,#12
OUT (C),A

RST #30
DW COPY_PAGE
DB страница.

LD BC,#1FFD
XOR A
OUT (C),A
RET

COPY_PAGE LD HL,0
LD DE,#8000
LD BC,#4000
LDIR : RET

Подставляем номера страниц и снимаем их из ОЗУ. Hо здесь есть
маленькая проблема: каждая четвертая страница сегмента
(3,7,11,15). Дело в том, что для спека это страницы TR-DOS'а, и
в случае, если выполняемый код выходит за пределы ПЗУ, то
включается "ПЗУ 48" - 1-я страница сегмента. И если 3-ю страницу
взять очень легко (стандартный TR-DOS), то страницы 7,11 и 15
вызывают затруднение. Однако в случае эмулирования прошивки
27010 нам потребуется лишь 7-я страница.

Вот, собственно, и все. Если возникнут какие-либо вопросы,
пиши. Обязательно напиши, как - помогла тебе моя информация или
ты все это уже знал? И напиши, удалось ли тебе вытащить 7-ю
страницу. Если нет, то я что-нибудь придумаю.


Счастливо, Влад (Vega, ex Style Group).




С уважением, Vega.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Мысли вслух - Как-то одним прекрасным утром, ехал я в нашем забитом троллейбусе, направляясь к месту прохождения своей учебы в одном из местных ВУЗов...
Конкурс - Pедакция журнала 'REALTIME' объявляет конкурс на лучшую картинку , мультфильм или лучшую музыку.
График BBS - График работы BBS на неделю.
Вступление - Об ошибках в пятом номере газеты.
About KrNews13 - "чего не хватает сцене сегодня?" насущные вопросы и пути решения.

В этот день...   19 апреля