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одолжение следует ...




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

Похожие статьи:
Застрял ? - Описание игры "The Master of Magic".
Игры - Blood Wich.
Проходилка - прохождение игры Twilight: Land of Shadows.

В этот день...   14 ноября