City #20
14 июля 1999

Ликбез - полный дизассемблеп ПЗУ TR-DOS'a.

        ООООООООООООООООООООО
     ОООООООООО  ЛИКБЕЗ  ОООООООООО
            ООООООООООООООООООООО

╔════════════════════════════════════════╗
║                                        ║
║  ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ║
║                    ПЗУ                 ║
║                                        ║
║          TR-DOS 5.04T (5.03)           ║
║                                        ║
║           ДЛЯ ПРОФЕССИОНАЛОВ,          ║
║                                        ║
║             А ТАКЖЕ ДЛЯ ТЕХ,           ║
║                                        ║
║           КТО ХОЧЕТ ИМИ СТАТЬ.         ║
║                                        ║
╚════════════════════════════════════════╝

               пpодолжение





 П.Федин
Адрес 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        ;возврат
──────────────────────────────────────────
Адрес 1316. Вычисление номера дисковода по
его имени.  Имя  поместите  в А, на выходе
там будет номер.
1316  AND 223   ;буква заглавная
      SBC A,65  ;вычисление  номера диско-
                 вода
      JP C,7450 ;если  именем  был  символ
                 меньше "A", то ошибка
      CP 4      ;номер получился больше 3?
      JP NC,7450;если да, то ошибка
      RET       ;возврат
──────────────────────────────────────────
Адрес 1338. Выполнение  команды NEW. Уста-
новите 23825 и 23611. Используется также с
адреса  1385  (запись  информации о файле;
номер файла задайте в регистре C).

1338  CALL 7629   ;прием  имен  файлов  на
                   стек калькулятора
      CALL 7541   ;если  идет  проверка на
                   синтаксис,  то  возврат
      CALL 4142   ;прием расширения  файла
      CALL 7344   ;установка старого имени
                   файла
      LD A,(23798);берем номер дисковода
      LD (23800),A;сохраняем его
      JP NZ,985   ;если файл не найден, то
                   ошибка
      PUSH BC     ;сохранение номера файла
      CALL 5725   ;загрузка описателя фай-
                   ла
      CALL 7344   ;установка  нового имени
                   файла
      PUSH AF     ;сохранение   результата
                   проверки имени файла
      LD A,(23800);в  новом  имени   файла
                   назначен  другой диско-
                   вод

      LD HL,23798
      CP (HL)
      JP NZ,7450  ;если да, то ошибка
      CALL 1029   ;настройка на диск
      POP AF      ;восстановление  резуль-
                   тата   проверки   имени
                   файла
      JP Z,7248   ;если   такой  файл  уже
                   есть, то ошибка
      POP BC      ;восстановление   номера
                   файла
1385  CALL 5739   ;загрузка сектора с опи-
                   сателем файла  и замена
                   описателя
      CALL 7747   ;перезапись сектора
      JP 993      ;сообщение O.K.
──────────────────────────────────────────
Адрес 1394. Проверка переменной 23824. Со-
ответственно содержимому  будет установлен
флаг Z,а само содержимое будет в аккумуля-
торе.

1394  LD A,(23824)
      OR A
      RET
──────────────────────────────────────────
Адрес 1399.  Проверка  количества  стертых
файлов. Установите
23825. Если  там 0,  то будет сообщение NO
FILE, иначе O.K.
1399  LD A,(23825);берем  количество стер-
                   тых файлов
      OR A        ;оно равно 0 ?
      JP Z,985    ;если да, то NO FILE
      JP 993      ;иначе O.K.




        пpодолжение следует ...




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

Похожие статьи:
Log auto save - Вот придумал я эдакую рубрику, кишащую приколами...
Печатается с продолж. - Сто рассказов о Чукче (86-100).
Юмор - Как стать 'НОВЫМ РУССКИМ'.

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