Полное описание и дизассемблер ПЗУ TR-DOS 5.04T (5.03) 1995 г.

Глава 5 - полный дизассемблер ПЗУ TR-DOS 5.04T. (адреса 298-1303).


Адрес 298. Обработка номера строки автостарта программы на бей-
сике. Установите 23824 и загрузите программу.

298   CALL 8421    ;изменение памяти и удаление буфера
      CALL 7575    ;очистка экрана

Ох, как меня это бесит, если одна программа на бейсике грузит
заставку, а затем другую программу на бейсике.

      LD HL,(23641);берем адрес, по которому находится номер
      INC HL       ;строки автозапуска программы
      LD E,(HL)    ;берем этот номер
      INC HL
      LD D,(HL)
      LD A,D       ;это 0 ?
      OR E
      EX DE,HL     ;переброска его в HL
      JR Z,320     ;если это не 0, то программу запускать
      XOR A
      LD (23824),A
320   PUSH HL      ;сохранение номера строки автостарта
      CALL 562     ;восстановление старого адреса подпрограммы обработки ошибок
      POP HL       ;восстановление номера строки автостарта
      LD (23618),HL;установка его
      XOR A        ;строку запускать с первого оператора
      LD (23620),A
      RST 32       ;очистка рабочей области памяти, стека калькулятора и
                   ;буфера редактора
      DEFW #16B0
      LD HL,(23635);выполнение RESTORE
      DEC HL
      LD (23639),HL
      LD SP,(23613);очистка стека
      LD A,(23824) ;программу запускать ?
      OR A
      LD HL,7030   ;адрес подпрограммы выполнения программы на бейсике
      JR Z,358     ;если можно, то запуск программы
      RST 32       ;сообщение O.K.
      DEFW #1BB0
358   PUSH HL      ;помещение на стек адреса подпрограммы выполнения программы
                    на бейсике
      LD HL,23746  ;помещение на стек адреса переключателя ПЗУ на бейсик
      PUSH HL
      RET          ;переход к подпрограмме выполнения программы на бейсике
----------------------------------------------------------------
Адрес 364. То же, что и 15642, но не создает системные перемен-
ные.

364   CALL 8433    ;изменение памяти
      CALL 10570   ;создание буфера
      LD A,255     ;сообщения не печатать
      LD (23829),A
      XOR A        ;обнуление 23799
      LD (23799),A
      LD A,170     ;заставку не выводить
      LD (23831),A
      LD HL,513    ;возвращаться в бейсик
      LD (23834),HL
      LD HL,0      ;сохранение SP
      ADD HL,SP
      LD (23836),HL
      DEC HL       ;выделение места для адреса подпрограммы
      DEC HL       ;обработки ошибок
      LD SP,HL
      CALL 541     ;установка адреса подпрограммы обработки ошибок
      LD HL,(23730);командная строка находится выше RAMTOP ?
      LD DE,(23645)
      SBC HL,DE
      EX DE,HL
      JR NC,421    ;если да, то при выделении буфеpа она не
      OR A         ;перемещалась
      LD DE,257
      SBC HL,DE
421   LD (23645),HL
424   CALL 455     ;следующий символ строки ENTER ?
427   JP Z,467     ;если да, то завершение
      CP 234       ;это REM ?
      INC HL       ;следующий символ
      JR NZ,424    ;если нет, то следующий символ
      CALL 455     ;следующий символ строки ENTER ?
      JR Z,427     ;если да, то завершение
      CP ":"       ;это двоеточие ?
      JP NZ,467    ;если нет, то возврат
      INC HL       ;следующий символ
      CALL 12360   ;сжатие строки
      JP 778       ;выполнение команды
----------------------------------------------------------------
Адрес 455. берет символ по адресу из HL и возвращает его в акку-
муляторе плюс флаг Z если это 0, 13 или 128, иначе NZ.

455   LD A,(HL);берем байт по нужному адресу
      CP 13    ;это 13 ?
      RET Z    ;если да, то возврат
      CP 128   ;это 128 ?
      RET Z    ;если да, то возврат
      OR A     ;сравнение его с нулем
      RET      ;возврат
----------------------------------------------------------------
Адрес 467. Подпрограмма завершения. Вход: установить 23734,
23820, 23823, 23825, 23832, 23834, 23836 и 23839. Выход: в SP
адрес из 23836, а в BC код ошибки.

467   LD HL,0      ;буфер убирать, память изменять
      LD (23800),HL
      CALL 8421    ;если есть буфер, то уберем его
      CALL 7523    ;если надо, то очистка рабочей области памяти
      LD HL,23831  ;заставку не выводить
      LD (HL),170
      LD HL,23839  ;команда поступила из машинного кода ?
      LD A,(HL)
      OR A
      LD (HL),0    ;следующая команда будет не из маш. кода
      JR NZ,499    ;если команда была не из машинного кода, то
      CALL 7708    ;удаление из строки 5-байтовых чисел
      CALL 530     ;и прогон символов до конца строки
499   LD SP,(23836);помещаем в SP адрес из 23836
      LD HL,(23834);берем адрес выхода из этой подпрограммы
      LD BC,(23823);помещаем в BC код ошибки
      LD B,0
      JP (HL)      ;переход по назначенному адресу
----------------------------------------------------------------
Адрес 513. Проверка на ошибку. Вход: установите 23610 и 23827.

513   CALL 562     ;помещение в 23613 адреса из 23827
      BIT 7,(IY+0) ;была ошибка ?
      RET NZ       ;если нет,то возврат
      LD DE,23746  ;адрес команды RET в озу
      LD SP,(23613);установка SP на дно стека
      PUSH DE      ;переход на обработку ошибок
      RET
----------------------------------------------------------------
Адрес 530. Прогон символов до конца строки. Установите в 23645
адрес одного из символов строки. На выходе там будет адрес конца
строки.

530   CALL 7564;берем текущий символ строки
      CP 13    ;это ENTER ?
      RET Z    ;если да, то возврат
      CALL 7722;берем следующий символ строки
      JR 530   ;повтор
----------------------------------------------------------------
Адрес 541. Установка адреса обработки ошибок. Вход: в 23836 дол-
жен быть адрес на 2 больше того, по которому размещаете адрес
подпрограммы обработки ошибок. Выход: старое содержимое 23613
копируется в 23827, а в 23613 помещается адрес, по которому на-
ходится размещенный адрес.

541   LD HL,(23613);сохранение старого содержимого 23613
      LD (23827),HL
      LD HL,(23836);берем адрес из 23826
      DEC HL       ;берем нужный нам адрес
      DEC HL
      LD (23613),HL;установка 23613
      LD DE,15638  ;адрес подпрограммы обработки ошибок
      LD (HL),E    ;запись его в наши ячейки
      INC HL
      LD (HL),D
      RET          ;возврат
----------------------------------------------------------------
Адрес 562. Помещение в 23613 адреса из 23827. Установите 23827.

562   LD HL,(23827)
      LD (23613),HL
      RET
----------------------------------------------------------------
Адрес 569. Вход в командный процессор. Используется также с ад-
реса 635 (запуск файла "boot").

569   LD HL,0      ;обнуление 23799 и 23800
      LD (23799),HL
      ADD HL,SP    ;сохранение SP
      LD (23836),HL
      DEC HL       ;выделение места для адреса подпрограммы
      DEC HL       ;обработки ошибок
      LD SP,HL
      CALL 541     ;установка адреса подпрограммы обработки ошибок
      LD HL,23831  ;заставку выводить ?
      LD A,(HL)
      CP 170
      LD A,0       ;ошибок нет
      LD (23823),A
      JP Z,715     ;если заставка не нужна, то переход к командному процессору
      LD (HL),170  ;в следующий раз заставку не выводить
      CALL 7575    ;очистка экрана
      CALL 7560    ;открытие потока 2
      LD HL,864    ;вывод текста заставки
      RST 24
      CALL 4206    ;вывод цветных полос
      LD A,(23734) ;интерфейс-1 есть ?
      CP 244
      JR Z,625     ;если да, то
      LD HL,4096   ;вывод "Interface one fitted."
      RST 24
625   LD A,(23296) ;файл "boot" запускать ?
      CP 170
      JR NZ,715    ;если нет, то вход в командный процессор
      CALL 8433    ;изменение памяти
      LD HL,(23641);берем адрес буфера команд
      LD A,254     ;был запущен файл "boot"
      LD (23822),A
      LD (HL),247  ;ввод команды RUN"boot"
      INC HL
      LD (HL),34
      INC HL
      LD (HL),"b"
      INC HL
      LD (HL),"o"
      INC HL
      LD (HL),"o"
      INC HL
      LD (HL),"t"
      INC HL
      LD (HL),34
      INC HL
      LD (23643),HL;установка адреса курсора
      LD (HL),13   ;ENTER
      INC HL
      LD (HL),128  ;конец области
      INC HL
      LD (23649),HL;установка переменной WORKSP
      LD (23651),HL;установка и очистка стека калькулятора
      LD (23653),HL
      SET 3,(IY+1) ;установка режима L
      JR 751       ;выполнение команды
----------------------------------------------------------------
Адрес 688. Перенос трех байтов из адреса HL по адресу DE.

688   LD B,3   ;количество байтов
690   LD A,(HL);перенос байта
      LD (DE),A
      INC HL   ;адреса следующих байтов
      INC DE
      DJNZ 690 ;повтор до конца
      RET      ;возврат
----------------------------------------------------------------
Адрес 697. Остановка дисковода. В A поместите значение системно-
го регистра.

697   LD B,32    ;32 повтора
699   PUSH BC    ;сохранение количества повторов
      XOR 8      ;переключение бита 3
      OUT (255),A;загрузка системного регистра
      PUSH AF    ;сохранение значения системного регистра
      LD A,5     ;задержка в 17962 такта
      CALL 15871
      POP AF     ;восстановление значения системного регистра
      POP BC     ;и количества повторов
      DJNZ 699   ;повтор до конца
      RET        ;возврат
----------------------------------------------------------------
Адрес 715. Командный процессор. Используется также с адресов:
751 - исполнение команды. Сжатую команду поместите в буфер ко-
мандной строки;
778 - исполнение команды. Установите все для 467, 23825 и загру-
зите из 23825 HL.

715   LD HL,(23836);очистка стека
      DEC HL
      DEC HL
      LD SP,HL
      CALL 8433    ;изменение памяти
      CALL 7555    ;открытие потока 0
      LD A,(23830) ;выбор дисковода D:
      OR 3
      CALL 697     ;остановка его
      LD A,(23830) ;остановка текущего дисковода
      CALL 697
      XOR A        ;сообщения об ошибках печатать
      LD (23829),A
      CALL 8501    ;принятие команды
      CALL 12338   ;сжатие командной строки
751   CALL 7583    ;очистка низа экрана
      LD HL,715    ;возвращаться в командный процессор
      LD (23834),HL
      XOR A        ;ошибок не было
      LD (23823),A
      LD HL,(23641);берем адрес командной строки
      PUSH HL      ;сохраняем его
      LD DE,23840  ;адрес буфера
      CALL 688     ;сохранение трех первых символов строки
      POP HL       ;восстановление адреса строки
      LD (23825),HL;установка адреса командной строки
778   LD A,(HL)    ;берем первый символ строки
      LD B,A       ;сохраняем его
      AND 128      ;его код меньше 128 ?
      LD A,B       ;восстановление символа
      JR Z,794     ;если его код меньше 128, то дисковод не устанавливать
      CP 254       ;это RETURN ?
      JR Z,794     ;если да, то дисковод не устанавливать
      PUSH AF      ;сохранение символа
      CALL 15816   ;активизация дисковода по умолчанию
      POP AF       ;восстановление символа
794   LD HL,12275  ;адрес таблицы команд
      DEC HL
      LD C,0       ;проверка первой команды
800   INC C
      LD D,A       ;сохранение символа
      LD A,21      ;пройдена вся таблица ?
      CP C
      JP C,467     ;если да, то завершение

Лучше было бы поставить здесь JP C,7450 для выдачи сообщения
"*ERROR*".

      LD A,D       ;восстановление символа
      INC HL       ;адрес следующей команды в таблице
      CP (HL)      ;символы совпали ?
      JR NZ,800    ;если нет, то повтор
      CP 254       ;введена команда RETURN ?
      CALL NZ,10570;если нет, то создание буфера
      LD A,9       ;поиск файла вести по 9 байтам
      LD (23814),A
      XOR A        ;ошибок не было
      LD (23823),A
      LD (23766),A ;расширение файла принимать
      LD (23824),A ;на случай загрузки или верификации файла
      LD HL,23611  ;проверка строки на синтаксис
      RES 7,(HL)
      LD B,0       ;перевод номера команды в двухбайтную форму
      LD HL,12296  ;адрес таблицы адресов подпрограмм
      DEC C        ;команды считать с нуля
      SLA C        ;умножение номера подпрограммы на 2
      ADD HL,BC    ;определение адреса в таблице
      LD E,(HL)    ;берем адрес подпрограммы
      INC HL
      LD D,(HL)
      EX DE,HL     ;переносим его в HL
      PUSH HL      ;сохраняем его
      LD DE,857    ;возврат будет в 857
      PUSH DE
      JP (HL)      ;вызов подпрограммы
857   LD HL,23611  ;выполнение команды
      SET 7,(HL)
      POP HL       ;восстановление адреса подпрограммы
      JP (HL)      ;вызов подпрограммы
----------------------------------------------------------------
Адрес 864. Текст заставки TR-DOS.

864   DEFB 22,1,15
      DEFM "* TR-DOS Ver 5.04T*"
      DEFB 13,13,127
      DEFM " 1986 Technology Research ltd."
      DEFB 22,5,11
      DEFM "(U.K.)"
      DEFB 22,7,5
      DEFM "BETA 128"
      DEFB 0
----------------------------------------------------------------
Адрес 940. Завершение выдачи каталога.

940   CALL 1021    ;загрузка в буфер сектора 8 дорожки 0
      CALL 15744   ;перевод строки
      CALL 15744   ;еще раз
      LD BC,(24074);берем количество свободных секторов на диске
      CALL 7593    ;печать его
      LD HL,10706  ;печать FREE
      RST 24
      JP 467       ;завершение
----------------------------------------------------------------
Адрес 960. Переход к подпрограмме завершения.

960   JP 467
----------------------------------------------------------------
Адрес 963. Печать сообщения об ошибке. В HL установите адрес со-
общения, в A - код ошибки.

963   PUSH AF     ;сохранение кода ошибки
      LD A,(23822);ошибка произошла при автозагрузке ?
      CP 254
      JR NZ,973   ;если нет, то установка кода ошибки
      POP AF      ;снятие со стека кода ошибки
      RET         ;возврат
973   POP AF      ;восстановление кода ошибки
      LD (23823),A;установка кода ошибки
      LD A,(23829);печать сообщений разрешена ?
      OR A
      CALL Z,9991 ;если да, то печать сообщения

Ошибка!!! Перед печатью надо открыть поток 0 и очистить низ эк-
рана.

      RET         ;возврат
----------------------------------------------------------------
Адрес 993. Вывод сообщения O.K.

993   LD HL,10086;адрес сообщения O.K.
      XOR A      ;код ошибки - 0
      JP 7242    ;выдача сообщения и завершение
----------------------------------------------------------------
Адрес 1000. Загрузка сектора 0 дорожки 0 в буфер. Обнуляет
23756. Используется также с адресов:
1004 - загрузка сектора дорожки 0 в буфер. Установите 23756.
1010 - загрузка сектора в буфер, номер сектора в E, дорожки - в
D).

1000  XOR A        ;текущий сектор 0
      LD (23756),A
1004  LD DE,(23756);берем номер сектора
      LD D,0       ;дорожка 0
1010  CALL 10570   ;создание буфера
      LD HL,23845  ;загружать в буфер
      LD B,1       ;1 сектор
      JP 7741      ;загрузка сектора
----------------------------------------------------------------
Адрес 1021. Загрузка в буфер сектора 8 дорожки 0. Установите
23820.

1021  CALL 10570;создание буфера, если его нет
      LD DE,8   ;дорожка 0, сектор 8
      JR 1010   ;загрузка сектора в буфер
----------------------------------------------------------------
Адрес 1029. Настройка на диск. Меняет переменную с типом диско-
вода.

1029  CALL 1021   ;чтение в буфер сектора 8 дорожки 0
      LD A,(24076);диск от TR-DOS ?
      CP 16
      JR Z,1045   ;если да, то установка типа дисковода
      LD HL,10722 ;адрес сообщения DISC ERROR
      RST 24      ;печать сообщения
      JR 960      ;завершение

Внимание, ошибка!!! Неправильно обрабатывается ошибка. Здесь
программа должна быть такой:
      LD HL,10722
      LD A,7
      JP 7242
А в этом случае ваша программа не получит код ошибки, а внизу
экрана совершенно не к месту появится DISC ERROR.

      CALL 15889  ;берем тип дисковода
      RES 0,(HL)  ;установка типа дисковода под тип диска
      RES 1,(HL)  ;и возврат
      LD A,(24072)
      BIT 0,A
      JR NZ,1061
      SET 0,(HL)
1061  BIT 3,A
      RET NZ
      SET 1,(HL)
      RET

Ошибка!!! Перед установкой типа надо бы проверить совместимость
диска и дисковода.
----------------------------------------------------------------
Адрес 1067. Проверка второго символа командной строки. Вход: ус-
тановите 23825. На выходе будет установлен флаг Z, если это EN-
TER и сброшен, если нет.

1067  LD HL,(23825);берем адрес начала строки команды
      INC HL       ;берем адрес ее второго символа
      LD A,(HL)    ;берем этот символ
      CP 13        ;сравнение его с ENTER
      RET          ;возврат
----------------------------------------------------------------
Адрес 1075. Выполнение команды CAT. Установите 23825 и 23611.
Используется также с адреса 1145 (вывод каталога диска; в A -
номер потока, в буфере - сектор 8 дорожки 0).

1075  CALL 1067    ;второй символ строки команды ENTER ?
      LD BC,2      ;каталог выводить в поток 2
      LD (23771),BC
      JR Z,1130    ;если второй символ строки ENTER, то вывод каталога
      CP "#"       ;второй символ строки "#" ?
      JR NZ,1117   ;если нет, то установка дисковода и вывод каталога
      LD (23645),HL;установка CH_ADD на второй символ строки
      CALL 7691    ;установка номера потока
      CALL 7564    ;берем текущий символ
      CP 13        ;это ENTER ?
      JR Z,1130    ;если да, то вывод каталога
      CP ","       ;это запятая ?
      JP NZ,7450   ;если нет, то синтаксическая ошибка
      CALL 7722    ;берем следующий символ
      CALL 7613    ;помещение имени дисковода на стек калькулятора
      JR 1120      ;установка дисковода и вывод каталога
1117  CALL 7647    ;установка CH_ADD и помещение имени дисковода на
                   ;стек калькулятора
1120  CALL 7541    ;если строка проверяется на синтаксис, то возврат
      CALL 7605    ;снятие имени дисковода со стека калькулятора
      EX DE,HL
      CALL 7297    ;установка дисковода
1130  CALL 7541    ;если проверка на синтаксис, то возврат
      LD A,(23798) ;помещение номера дисковода в 23801
      LD (23801),A
      CALL 1029    ;настройка на диск
      LD A,(23771) ;берем номер потока
1145  CP 2         ;выводим в поток 2 ?
      PUSH AF      ;сохранение номера потока
      CALL Z,7575  ;если назначен поток 2, то очистка экрана
      POP AF       ;восстановление номера потока
      CP 17        ;он больше 16 ?

Ошибка!!! Всего потоков 15, а не 16.

      JP NC,7450   ;если да, то ошибка
      CALL 7556    ;открытие потока

Ошибка!!! Надо бы проверить, подключен ли куда-нибудь этот по-
ток.

      LD A,255     ;установка 23800 в 255
      LD (23800),A
      LD HL,10743  ;печать TITLE:
      RST 24
      LD HL,24090  ;печать имени диска
      RST 24
      CALL 15744   ;перевод строки
      LD A,(24073) ;вычисление количества нестертых файлов на диске
      LD HL,24089
      SUB (HL)
      PUSH HL
      CALL 7587    ;печать его
      LD HL,10795  ;печать FILES
      RST 24
      POP HL
      LD C,(HL)    ;берем количество стертых файлов
      CALL 7588    ;печать его
      LD HL,10781  ;печать DEL.FILES
      RST 24
      CALL 1000    ;загрузка в буфер сектора 0 дорожки 0
      LD HL,23845  ;берем начало буфера
1206  CALL 1270    ;проверка достижения конца каталога
      CALL 15744   ;перевод строки
      LD A,(23798) ;печать имени дисковода
      ADD A,"A"
      RST 16
      LD B,2       ;печатаем по 2 имени в строке
1220  CALL 1270    ;если файл стерт, то пропуск его
      PUSH BC      ;сохранение количества имен файлов в строке
      LD A,":"     ;печать двоеточия
      RST 16
      PUSH HL      ;сохранение адреса текущего описателя файла в буфере
      CALL 10552   ;печать имени и расширения файла
      LD BC,13     ;вычисление адреса, по которому находится
      POP HL       ;размер файла в секторах
      PUSH HL
      ADD HL,BC
      LD C,(HL)    ;берем размер файла
      PUSH BC      ;сохраним его
      LD A,C       ;перегрузим его в A
      LD B,2       ;вычисление количества пробелов перед числом
      CP 10
      JR C,1247
      DEC B
      CP 100
      JR NC,1256
1251  LD A," "     ;печать пробелов
      RST 16
      DJNZ 1251
1256  POP BC       ;восстановление размера файла
      CALL 7593    ;печать его
      POP HL       ;восстановление адреса текущего описателя файла
      POP BC       ;восстановление количества имен файлов в строке
      LD DE,16     ;следующий описатель
      ADD HL,DE
      DJNZ 1220    ;если напечатали только 1 файл, то печать второго
      JR 1206      ;следующая строка
----------------------------------------------------------------
Адрес 1270. Проверка переменной 23801 и проверка достижения кон-
ца каталога при его печати.

1270  PUSH HL      ;сохранение HL и BC
      PUSH BC
      LD A,(23801) ;берем номер дисковода для выдачи каталога
      LD HL,23798  ;назначен этот дисковод ?
      CP (HL)
      CALL NZ,15755;если нет, то о последствиях читайте в конце

Ошибка в программе!!! Об этом особо в конце текста.

      POP BC       ;восстановление HL и BC
      POP HL
      JP 12230     ;проверка достижения конца каталога и возврат

Обратите особое внимание на команду CALL NZ,15755. В аналогичной
подпpогpамме для LIST стоит CALL NZ,15819. В нашем же случае уп-
pавление будет передано в подпрограмму печати символа (ее адрес
15744) на адрес, где находятся 2 байта адреса от команды
CALL 15764. Программа с этого адреса будет такой:
SUB H
DEC A
CALL 8433
POP DE
POP BC
POP HL
RET
Таким образом произойдет изменение памяти, если оно разрешено,
затем со стека будут сняты 3 адреса и помещены в регистры и за-
тем произойдет возврат. Последствия всего этого определяются
программой, вызвавшей 1270.
----------------------------------------------------------------
Адрес 1287. Прибавление 16 к HL.

1287  LD DE,16
      ADD HL,DE
      RET
----------------------------------------------------------------
Адрес 1292. Проверка и обработка достижения конца буфера при ра-
боте с каталогом. Установите 23756 и поместите в HL текущее мес-
то буфера. Если достигнут его конец, то в HL будет начало буфера
и в него будет загружен следующий сектор каталога.

1292  PUSH HL    ;сохранение HL и BC
      PUSH BC
      LD BC,41435;достигнут конец буфера ?
      ADD HL,BC
      JR C,1303  ;если да, то загрузка следующего сектора
      POP BC     ;восстановление HL и BC
      POP HL
      RET        ;возврат
1303  LD HL,23756;следующий сектор
      INC (HL)
      CALL 1004  ;загрузка его в буфер
      POP BC     ;восстановление BC и HL
      POP HL
      LD HL,23845;помещение в HL адреса начала буфера
      RET        ;возврат



СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
BBS - список станций BBS ZXNet.
Тусовка - From:OPER, No disk, КАКЭТО NO DISK??
Железо - Капитан Nemo предлагает поделиться технологией KAY со всеми желающими заняться производством.
От авторов - BODY снова в сети минской ZX-NET.
body postbox - нам пишут: relict, PoP HL, Губский Роман Алексеевич.

В этот день...   29 марта