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. |
Похожие статьи:
В этот день... 21 ноября