City #38
29 декабря 1999

Ликбез - полный дизассемблер ПЗУ (часть 29).

┌─────────────────────────────────────────────────┐
│    *************   ЛИКБЕЗ   ****************    │
└─────────────────────────────────────────────────┘

(c) П.Ю.Федин

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

                  пpодолжение

Адрес 6427. Помещает число 3 по адресу 23766.
6427  LD A,3
      LD (23766),A
      RET
───────────────────────────────────────────────────
Адрес 6433. Загрузка/верификация файла, а также за-
грузка/запись   сектора   файла.  Вход:  установите
23801, 23824, 23767, 23771,  в HL - адрес загрузки,
в DE - адрес файла на диске,в B - количество секто-
ров для загрузки.
6433  CALL 1394    ;выполняется загрузка  или вери-
                    фикация ?
      JR Z,6445    ;если да, то выполнение операций
                    со всем файлом
      PUSH AF      ;сохранение флага операции
      CALL 6804    ;вычисление  адреса  сектора  на
                    диске
      POP AF       ;восстановление флага операции
      CP 255       ;чтение сектора файла ?
6445  PUSH AF
      CALL Z,6492  ;если да, то  чтение сектора или
                    операция с файлом
      POP AF
      JR Z,6455    ;и завершение загрузки или вери-
                    фикации
      JP 7757      ;иначе запись  сектора и возврат
6455  LD A,(23766) ;загружать весь файл ?
      CP 3
Не нужно этого делать!!! Лучше так:
LD A,(23824)
OR A
и PEEK будет работать правильно. Не будет  грузится
мусор после загруженного сектора. Ведь если в 23766
находится 0, то младший байт длины всегда равен 0 и
6470 не будет работать.
      CALL Z,6470  ;если да, то загрузка или  вери-
                    фикация конца файла
      LD HL,(23641);отметка   конца   программы  на
                    бейсике
      DEC HL
      LD (HL),128
      RET          ;возврат
───────────────────────────────────────────────────
Адрес 6470. Загрузка  или верификация  конца файла.
Установите 23796, 23771 и 23801.
6470  LD A,(23801) ;верификация ?
      CP 255
      JP NZ,12254  ;если  нет,  то  загрузка  конца
                    файла
      LD A,(23771) ;файл  занимает  сектора без ос-
                    татка ?
      OR A
      RET Z        ;если да, то возврат
      LD C,A       ;берем длину остатка
      LD B,1       ;1 сектор
      LD DE,(23796);текущее место диска
      JR 6506      ;верификация конца файла  и воз-
                    врат
───────────────────────────────────────────────────
Адрес 6492. Загрузка/верификация файла а также заг-
рузка сектора файла. Установите 23801, в  DE помес-
тите адрес файла на диске, в HL - адрес файла в па-
мяти,  в B - длину файла  в секторах.  Используется
также с адреса 6506 для верификации заданного коли-
чества байтов (все для 6492, кроме  23801  плюс в B
- количество байтов).
6492  LD A,(23801) ;верификация ?
      CP 255
      JP NZ,7741   ;если нет, то загрузка  секторов
                    и возврат
      LD (23796),DE;запомним адрес файла на диске
      LD C,0       ;в секторе 256 байтов
6506  LD A,B       ;верифицируем 0 секторов ?
      OR A
      RET Z        ;если да, то возврат
      LD (23767),HL;сохранение адреса файла в памя-
                    ти
      LD (23769),DE;сохранение адреса файла на дис-
                    ке
6516  PUSH BC      ;сохранение  количества секторов
      LD B,1       ;загружать 1 сектор
      LD DE,(23769);с текущего места диска
      LD HL,23845  ;в буфер
      CALL 7741    ;загрузка сектора
      LD HL,(23796);адрес  следующего   сектора  на
                    диске
      LD (23769),HL
      POP BC       ;восстановление количества  сек-
                    торов
      LD HL,(23767);берем адрес файла в памяти
      LD DE,23845  ;адрес сектора в буфере
6542  LD A,(DE)    ;сравнение их
      CP (HL)
      JR NZ,6557   ;если  несовпадение,  то  VERIFY
                    ERROR
      INC HL       ;следующие байты
      INC DE
      DEC C
      JR NZ,6542   ;повтор до конца
      LD (23767),HL;установка следующего адреса
      DJNZ 6516    ;повтор до конца
      RET          ;возврат
6557  LD HL,10091  ;адрес сообщения VERIFY ERROR
      LD A,13      ;код ошибки - 13
      JP 7242      ;обработка ошибок

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




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

Похожие статьи:
Введемся - данный номер посвящен Constructions Chaos 2000.
Обзор новинок - Белый орел, Choppers, Rings of magic.
Этюды - А.Уржа. Процедура рисования окружности.

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