|
City
#10
10 апреля 1999 |
|
Ликбез - полное описание и полный дизассемблер ПЗУ (часть 6).

---------------------------------------------------
ЛИКБЕЗ
---------------------------------------------------
(c) П.Ю.Федин
╔═════════════════════════════════════════════════╗
║ ║
║ ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ ║
║ ║
║ TR-DOS 5.04T (5.03) ║
║ ║
║ ДЛЯ ПРОФЕССИОНАЛОВ, ║
║ ║
║ А ТАКЖЕ ДЛЯ ТЕХ, ║
║ ║
║ КТО ХОЧЕТ ИМИ СТАТЬ. ║
║ ║
╚═════════════════════════════════════════════════╝
пpодолжение
Способы обращения к ПЗУ TR-DOS
ПЗУ TR-DOS является теневым, поэтому к нему нельзя
обратиться непосредственно при помощи CALL. Но для
того, чтобы оно было доступно для использования,
существуют адреса,при переходе на которые включает-
ся ПЗУ TR-DOS. В ПЗУ бейсика-48 в этих адресах на-
ходится знакогенератор, следовательно обычно управ-
ление туда никогда не передается.
Внимание!!! В ПЗУ бейсика-128 в этих адресах на-
ходится программа,поэтому при включенном ПЗУ бейси-
ка-128 ПЗУ TR-DOS блокируется полностью. Ниже вы
видите список точек входа, переключающих ПЗУ.
15616 - вход в командный процессор TR-DOS.
15619 - выполнение команд TR-DOS из бейсика.
15622 - подпрограмма ввода из файла данных.
15629 - подпрограмма вывода в файл данных.
15632 - подпрограмма изменения памяти.
15635 - вызов подпрограмм TR-DOS из машинного кода.
15638 - подпрограмма обработки ошибок, поступающих
из ПЗУ бейсика.
15663 - переход на любой адрес в ПЗУ TR-DOS.
Как пользоваться этими точками входа
15616 - простой вызов. Можно установить переменные
23831 и 23296.
15619 - из бейсика:
RANDOMIZE USR 15619:REM:<команда>
из машинного кода:
1) разместить в памяти командную строку в
ASCII виде с префиксом REM:.
2) поместить в CH_ADD адрес этой строки.
3) CALL 15619.
Hапример:
LD HL,LINE ;установка CH_ADD
LD (23645),HL
JP 15619 ;выполнение команды
;командная строка
LINE DEFB 234 ;REM
DEFB ":" ;:
DEFB 239 ;HOAD
DEFB 34 ;"
DEFM "EXAMPLE";EXAMPLE
DEFB 34 ;"
DEFB 13 ;ENTER
15622 - открыть канал файла данных и вызвать.На вы-
ходе символ из файла будет в аккумуляторе.
15629 - открыть канал файла данных, поместить в A
символ и вызвать.
Внимание!!! Содержит ошибку.
15632 - просто вызвать. Проверяет 23734 и 23832 и
меняет блокипамяти местами, если нужно.
15635 - Номер подпрограммы поместите в регистр C,
остальное согласно таблице:
╔═══════╤═════════════════════════════════════════╗
║Команда│ Функции ║
╟───────┼─────────────────────────────────────────╢
║ 0 │Восстановление с ожиданием INTRQ. Воспри-║
║ │нимает BREAK ║
║ 1 │Выбор дисковода. Номер дисковода помести-║
║ │те в регистр A. Если в переменной с вре-║
║ │менем перемещения головки дисковода бит 7║
║ │включен, то определяется времЯ пеpемеще-║
║ │ния головки и проверяется переменная с║
║ │типом дисковода. Если она не равна 255║
║ │(ошибка), то будет определено количество║
║ │дорожек дисковода. При этом предполагает-║
║ │ся, что дисковод односторонний (ошибка).║
║ │Пpи возврате определяется номеp дорожки,║
║ │на которой стоит головка дисковода и за-║
║ │носится в регистр дорожки ║
║ 2 │Позиционирование. Логический ноль дорожки║
║ │поместите в A. Если по адресу 23757 не 0,║
║ │то после позиционирования будет задержка.║
║ │В программе есть ошибка ║
║ 3 │Помещает содержимое аккумулятора по адре-║
║ │су 23807 ║
║ 4 │Помещает содержимое HL по адресу 23808 ║
║ 5 │Чтение группы секторов. В HL поместите║
║ │адрес в памяти, в D - номер первой дорож-║
║ │ки, в E - номер первого сектоа, в B - ко-║
║ │личество секторов. ║
║ │В программе есть ошибка. ║ ║
║ 6 │Запись группы секторов.Параметры и ошибка║
║ │аналогично команде 5. ║ ║
║ 7 │Вывод каталога. В аккумулятор поместите║
║ │номер потока, а в 23801 поместите номер║
║ │дисковода из 23798. ║
║ │В программе есть ошибка. ║ ║
║ 8 │Чтение описателя файла по адресу 23773.║
║ │Номер файла поместите в аккумулятор ║
║ 9 │Запись описателя файла. Описатель размес-║
║ │тите по адресу 23773 и поместите номер║
║ │файла в аккумулятор ║
║ 10 │Поиск файла. Проверяемую часть описателя║
║ │разместите с адреса 23773, а ее длину по-║
║ │местите в 23814.Если файл найден,то в BC,║
║ │23823 и 23838 будет его номер,иначе 23838║
║ │не меняется, а в 23823 и BC будет 255 ║
║ 11 │Запись файла.Имя и расширение поместите с║
║ │23773, начало в памяти поместите в HL, а║
║ │длину - в DE ║
║ 12 │Запись программы на бейсике. Имя и расши-║
║ │рение поместите с адреса 23773. Если рас-║
║ │ширение не "B", то файл записывается как║
║ │кодовый ║
║ 13 │Не используется ║
║ 14 │Выполняет 5 функций: ║
║ │ Загрузка файла:в 23801 и 23824 поместите║
║ │ 0, имя и расширение поместите с 23773, а║
║ │ также: ║
║ │ Для бейсик - программ - больше ничего. ║
║ │ Для файлов CODE : ║
║ │ Пpи A=0 - адрес загрузки и длина бе-║
║ │ рутся из каталога. ║ ║
║ │ При A=3 - адрес загрузки берется из║
║ │ HL, длина - из DE. ║ ║
║ │ Иначе - адрес загрузки берется из║
║ │ HL, длина - из каталога. ║ ║
║ │ Для массивов - A<>0, в HL - длина тела║
║ │ старого массива или 0, если такового║
║ │ нет; в 23767 - адрес тела старого мас-║
║ │ сива в памяти, в 23762 - имя массива ║
║ │ Верификация файла - все как и для заг-║
║ │ рузки, только в 23801 поместите 255. ║ ║
║ │ Загрузка сектора файла - в 23801 помес-║
║ │ тите 0, в 23824 - 255, в 23767 - адрес║
║ │ загрузки, в HL - номер сектора, в A - 3,║
║ │ в DE - 0 (два последних действия для об-║
║ │ хода ошибки. ║
║ │ Внимание!!! Не работает с файлами BASIC║
║ │ и DATA из-за ошибки. ║
║ │ Верификация сектора файла- все как и при║
║ │ загрузке, только в 23801 поместите 255. ║ ║
║ │ Запись сектора файла - в 23801 поместите║
║ │255 (для обхода ошибки), в 23824 - не 0 ║
║ │ и не 255, в A - не 0, в HL - номер сек-║
║ │ тора, в 23767 - адрес в памяти ║
║15 - 17│Не используется ║
║ 18 │Стирание файлов. Имя и расширение помес-║
║ │тите с 23773, можно обнулить 23815, тогда║
║ │по окончании там будет число стертых фай-║
║ │лов ║
║ 19 │Перенос 16 байтов с адреса в HL по адресу║
║ │23873 ║
║ 20 │Обратное 19 ║
║ 21 │Проверка дорожки.Физический номер дорожки║
║ │поместите в аккумулятор и выберите сторо-║
║ │ну диска. Если обнаружены плохие сектора,║
║ │то в 23823 и BC будет 7, а в 23766 бу-дет║
║ │их количество ║
║ 22 │Выбирает верхнюю сторону диска ║
║ 23 │Выбирает нижнюю сторону диска ║
║ 24 │Проверяет принадлежность диска и настраи-║
║ │вает систему на его тип. Содержит ошибку ║
╚═══════╧═════════════════════════════════════════╝
15638 - внутренняя точка входа. Как использовать,
смотрите в дизассемблере.
15663 - поместите на стек нужный адрес, затем
JP 15663. В качестве примера привожу под-
программы выполнения двух команд TR-DOS,
отсутствующих в 15635.
Форматирование диска. Имя диска поместите в 23773.
CAHL 15632 ;изменение памяти
LD A,255 ;эта часть программы повторяет
15635
LD (23829),A ;сообщения не печатать
LD (23839),A ;работает машинный код
LD (23768),A ;дорожки не проверять
LD (23761),A ;NO DISC при чтении адресного
маркера игнорировать
LD HL,513 ;после завершения возврат бу-
дет в бейсик
LD (23834),HL
LD (23836),SP;сохранение SP
PUSH AF ;выделение места для адреса
подпрограммы обработки ошибок
LD HL,7901 ;адрес подпрограммы форматиро-
вания
PUSH HL ;помещение его на стек
LD HL,541 ;адрес подпрограммы установки
адреса обработки ошибок
PUSH HL ;помещение его на стек
JP 15663 ;вход в ПЗУ TR-DOS
Упаковка пространства диска.
CALL 15632 ;снова повторяем 15635
LD A,255
LD (23829),A
LD (23839),A
LD HL,513
LD (23834),HL
LD (23836),SP
PUSH AF
LD HL,5806 ;адрес подпрограммы упаковки
пространства диска
PUSH HL ;помещение его на стек
LD HL,541 ;дальше как в предыдущем при-
мере
PUSH HL
JP 15663
пpодолжение следует ...
Другие статьи номера:
От редакции - Хpистос воскpес, доpогие читатели! |
Железо - аналог IBM-овского последовательного поpта COM1 (COM2). |
Ликбез - полное описание и полный дизассемблер ПЗУ (часть 6). |
Бук - Похождения Штирлица и другие приключения Бормана. |
Реклама - Пpодам, куплю ,обменяю пpогpаммы для ZX Spectrum. |
Похожие статьи:
В этот день... 13 ноября