City #29
19 сентября 1999

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

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

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

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

                   пpодолжение

Адрес 4960.  Выполнение  команды COPY S. Установите
23825 и 23611.
4960  CALL 7621   ;установка CH_ADD
      CALL 7722   ;следующий символ
      CALL 7613   ;прием имени файла  на стек каль-
                   кулятора
      CALL 7541   ;если идет проверка на синтаксис,
                   то возврат
      CALL 5743   ;резервирование места в памяти
      LD HL,10154 ;печать INSERT SOURCE DISC
      CALL 9991
4981  CALL 4178   ;ввод символа с клавиатуры
      CP "Y"      ;это Y ?
      JR NZ,4981  ;если нет, то повтор
      CALL 7583   ;очистка низа экрана
      CALL 4142   ;прием расширения файла
      CALL 7344   ;установка имени файла
      JP NZ,985   ;если  такого файла нет, то ошиб-
                   ка
      CALL 5047   ;копирование файла
      LD A,(23781);расширение файла # ?
      CP "#"
      JP NZ,993   ;если нет, то O.K.
5011  LD A,10     ;файл искать по 10 символам
      LD (23814),A
      LD HL,23782 ;следующий блок
      INC (HL)
      CALL 7575   ;очистка экрана
      LD HL,10154 ;печать INSERT SOURCE DISC
      CALL 9991
5029  CALL 4178   ;ввод клавиши
      CP "Y"      ;это Y ?
      JR NZ,5029  ;если да, то повтор
      CALL 7347   ;поиск блока
      JP NZ,993   ;если не нашли, то O.K.
      CALL 5047   ;копирование блока
      JR 5011     ;повтор
───────────────────────────────────────────────────
Адрес 5047. Копирование файла при одном  дисководе.
Номер файла поместите в регистр C.
5047  CALL 5725    ;чтение описателя файла
      LD HL,23782  ;сохранение его части
      LD DE,23789
      LD BC,7
      LDIR
      LD A,(23793) ;установка объема файла в секто-
                    рах
      LD (23824),A
      CALL 1029    ;настройка на диск
      CALL 15889   ;сохранение режима дисковода
      LD (23769),A
      LD A,255     ;первый проход
      LD (23841),A
Внимание!! Эта переменная уже занята. В ней хранят-
ся первые 3 символа командной строки.
      CALL 5201     ;копирование файла
      LD HL,(23839) ;берем  адрес  файла на диске -
                     приемнике
      LD (23787),HL ;устанавливаем его
      LD HL,(23698) ;берем  новый  адрес свободного
                     места на диске
      LD (24070),HL ;устанавливаем его
      LD HL,24073   ;записали 1 файл
      INC (HL)
      LD C,(HL)     ;берем номер файла
      DEC C
      LD B,0        ;переводим   его  в двухбайтную
                     форму
      PUSH BC       ;сохраняем его
      LD DE,9       ;записывать  сектор 8 дорожки 0
      LD (23796),DE
      CALL 7747     ;запись сектора
      POP BC        ;восстановление номера файла
      CALL 5739     ;чтение и замена описателя фай-
                     ла
      CALL 7747     ;запись сектора с описателем
      RET           ;возврат
───────────────────────────────────────────────────
Адрес 5123. Проверка  наличия  свободного  места на
диске-приемнике для команды COPY S.  Поместите опи-
сатель файла в 23773 и его часть в 23789 и  устано-
вите 23824. В дисководе должен быть  диск-приемник.
Подпрограмма устанавливает 23786, 23787 и 23839.
5123  XOR A        ;не первый проход
      LD (23841),A
      CALL 1029    ;настройка на диск
      CALL 15889   ;берем режим дисковода
      LD (23770),A ;сохраняем его
      CALL 7347    ;поиск файла
      JP Z,7248    ;если нашли, то FILE EXISTS
      CALL 1021    ;загрузка в буфер  сектора 8 до-
                    рожки 0
      LD A,(24073) ;берем количество файлов на дис-
                    ке
      CP 128       ;их 128 ?
      JP Z,10019   ;если да, то DIRECTORY FULL
      LD HL,23789  ;восстановление описателя  файла
      LD DE,23782
      LD BC,7
      LDIR
      CALL 1021    ;загрузка в буфер сектора  8 до-
                    рожки 0
      LD A,(23824) ;восстановление  длины  файла  в
                    секторах
      LD (23786),A
      LD DE,(23786);перевод ее в двухбайтную  форму
      LD D,0
      OR A         ;сброс флага C
      LD HL,(24074);уменьшаем   свободное  место на
                    диске
      SBC HL,DE
      JP C,7237    ;если его не хватило,то NO SPACE
      LD (24074),HL;установка   нового   количества
                    свободного места на диске
      LD HL,(24070);берем адрес свободного места на
                    диске
      LD (23787),HL;установка адреса файла на диске
                    - приемнике
      LD (23839),HL;сохранение его

Боже мой!!! Hу что это такое! Ведь эта переменная -
флаг способа вызова  TR-DOS. И на такой DOS все ра-
ботают. Ужас какой-то.
      RET          ;возвpат

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




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

Похожие статьи:
Necronomicon - АЛЬ АЗИФ - ЗАШИФРОВАННЫЙ МАНУСКРИПТ!
COMICS - Анекдоты
Spectrum systemz - ZXAmp, unRAR, TRMSHob v2.0, Burial Graphics Editor v2.0, Freaker v0.5...

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