Программирование
В начале этого раздела говорилось о том, что в силу аппаратных
особенностей интерфейса Beta Disk доступ к подпрограммам из его ПЗУ и
регистрам микроконтроллера невозможен. Однако это не совсем так. Пере-
дать управление на любую ячейку ПЗУ можно не вполне обычным методом,
суть которого очень проста: нужно поместить адрес подпрограммы из ПЗУ в
стек, а затем передать управление на любую команду RET, находящуюся в
«открытой» части ПЗУ (в диапазоне адресов 15616...15871). Сам факт
передачи управления «заменит» ПЗУ, а команда RET извлечет из стека адрес
подпрограммы и передаст ей управление. Для того, чтобы вернуться в
вызывающую программу, перед адресом подпрограммы ПЗУ в стек нужно
записать еще адрес возврата*.
Вот как, например, можно «нажать» на кнопку MAGIC, если в интер-
фейсе ее забыли сделать.
Эту небольшую подпрограмму нужно расположить в памяти и вызвать
из Бейсика функцией USR.
START ЕХХ сохранение регистровой пары HL' необходимо
;дпя нормальной работы Бейсика
PUSH HL
LD HL,ADDRET ;запись в стек адреса возврата
PUSH HL
LD HLJ02 ;запись в стек адреса подпрограммы выполняю-
щейся при нажатии на кнопку MAGIC
PUSH HL
JP 15664 ;передача управления в теневое ПЗУ. По дан-
ному адресу расположена команда RET
ADDRET POP HL восстановление регистровой пары HL' и возврат
;в Бейсик
ЕХХ
RET
У приведенного способа есть один недостаток: необходимо точно знать
адреса вызываемых подпрограмм. Казалось бы, эта проблема довольно
просто решаема: достаточно один раз дизассемблировать ПЗУ и узнать все
«тонкости». Однако это только полдела. Фирма Technology Research разра-
ботала несколько версий ОС TR-DOS, у нас наибольшее распространение
получили версии 5.01 и 5.03. Несмотря на незначительные функциональ-
ные различия, большинство подпрограмм в этих версиях расположены по
разным адресам.
Определить, что именно находится в данном компьютере, можно,
считав в буфер первые 256 байт из ПЗУ. Для ОС версии 5.01 в байте с
адресом #19 будет записано число #BD, а для версии 5.03 — число #27.
Некоторой недоработкой ОС представляется отсутствие подпрограмм
непосредственной работы с регистрами микроконтроллера КР1818ВГ93.
Частично этот недостаток можно обойти, воспользовавшись частями системы
«в своих целях». Ниже описаны несколько полезных подпрограмм, при этом
приведен адрес для версии 5.03, а в скобках для версии 5.01.
Для записи в любой регистр (внешнее устройство) Beta Disk можно
воспользоваться подпрограммой, находящейся по адресу 10835 (10761).
В регистровой паре ВС необходимо разместить адрес системного
регистра или регистров микроконтроллера, а в аккумуляторе — записывае-
мое значение.
OUT (С),А
RET
Если с записью в регистры дело обстоит достаточно просто, то с
чтением начинаются проблемы — таких простых решений ОС не предостав-
ляет.
Прочитать регистры дорожки и сектора микроконтроллера невозмож-
но, поэтому в программе необходимо хранить их копии.
*) Как посмотреть содержимое «теневого» ПЗУ, было рассказано в разделе
«Идеология и структура».
Программа чтения регистра состояний микроконтроллера находится
по адресу 16179 (16169). Однако прежде, чем ее использовать, необходимо
выполнить ряд действий: в регистр дорожки микроконтроллера записать О,
в регистр сектора — #0А, а в регистр D микропроцессора записать 1.
Считанный регистр состояний возвращается в регистре В микропроцессора.
Ниже показан алгоритм считывания регистра состояний:
Напрямую считывать информацию из регистра данных нельзя, одна-
ко в ПЗУ есть две программы, которыми удобно пользоваться для считывания
и записи секторов, адресных маркеров, дорожек. Подпрограмма чтения
расположена по адресу 16341 (16331), а подпрограмма записи — по адресу
16341 (16304). Передавать управление подпрограмме нужно сразу же после
записи Команды в регистр команд микроконтроллера. Регистровая пара
микропроцессора HL должна содержать адрес размещения данных в памяти.
По выходе из подпрограммы регистровая пара HL указывает на байт,
расположенный за последним байтом данных, пара DE содержит случайное
значение;: Если по выходе из подпрограммы значение регистра В равно
нулю, то это указывает на ошибку. Конкретизировать ошибку или правиль-
ность операций можно, прочитав регистр состояний. Ниже представлен
алгоритм выполнения команд передачи данных:
На основании изложенных здесь сведений автором была написана
программа, выполняющая функции Базовой системы ввода/вывода, подроб-
ные сведения о которой помещены в следующем разделе.