City #21
24 июля 1999

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

---------------------------------------------------
                     ЛИКБЕЗ
---------------------------------------------------

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

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

                    пpодолжение

Адрес 1409.  Запрос  на  стирание файла. Установите
23773 и 23798, а в регистр C поместите номер файла.
При  ответе  Y файл будет стерт и включится флаг Z,
иначе он будет выключен.
1409  PUSH BC     ;сохранение номера файла
      CALL 7575   ;очистка  экрана  и  открытие по-
                   тока 0.
      LD A,(23798);берем номер дисковода
      ADD A,"A"   ;вычисляем имя дисковода
      CALL 15746  ;печать его
      LD A,":"    ;печать двоеточия
      CALL 15746
      LD HL,23773 ;адрес переменной с именем и рас-
                   ширением файла
      CALL 10552  ;печать имени и  расширения файла
      LD HL,10272 ;печать FILE  EXISTS. OVERWRITE ?
      CALL 9991
      CALL 4178   ;ввод клавиши
      CP "Y"      ;это "Y" ?
      PUSH AF     ;сохранение результата проверки
      CALL 7575   ;очистка экрана
      POP AF      ;восстановление AF и номера файла
      POP BC
      RET NZ      ;если был ответ N, то возврат
      PUSH BC     ;сохранение номера файла
      CALL 7575   ;очистка экрана
      POP BC      ;восстановление номера файла
      CALL 1921   ;стирание файла
      XOR A       ;включение флага Z
      RET         ;возврат
───────────────────────────────────────────────────
Адрес 1460. Проверка на существование блока файла с
расширением #. Установите 23773, 23781 и 23782. Ес-
ли  блок  найден  или у файла другое расширение, то
включается флаг Z, иначе он будет выключен.
1460  LD A,(23781);берем расширение файла
      CP "#"      ;это "#" ?
      JR Z,1469   ;если нет, то
      XOR A       ;включение флага Z
      RET         ;и возврат
1469  LD A,10     ;файл ищем по 10 байтам
      LD (23814),A
      CALL 7347   ;поиск файла
      LD A,9      ;файл ищем по 9 байтам
      LD (23814),A
      RET         ;возврат
───────────────────────────────────────────────────
Адрес 1483.  Выполнение команды COPY"*","*". Первую
звездочку поместите в 23773, вторую - на стек каль-
кулятора и установите 23800, 23843 и 23759.
1483  LD A,(23773);берем  первый символ имени файла
      CP "*"      ;это "*" ?
      JP NZ,985   ;если нет, то NO FILE
      CALL 7605   ;снятие строки со стека калькуля-
                   тора
      EX DE,HL
      CALL 7297   ;установка дисковода-приемника
      LD A,(HL)   ;берем следующий символ строки
      CP "*"      ;это "*" ?
      JP NZ,7450  ;если нет, то ошибка
      LD A,(23798);сохранение номера дисковода-при-
                   емника
      LD (23801),A
1524  LD A,(23801);выбор дисковода-приемника
      CALL 15819
      CALL 1029   ;настройка на диск
      LD A,255    ;начнем с файла 0
      LD (23821),A
      LD A,(23800);выбор дисковода-источника
      CALL 15819
      CALL 1029   ;настройка на диск
      LD A,(23821);следующий файл
      INC A
      LD (23821),A
      LD C,A
      CALL 5725   ;чтение его описателя
      LD A,(23773);берем  первый  символ  его имени
      CP 0        ;это конец каталога ?
      JP Z,993    ;если да, то O.K.
      CP 1        ;файл стерт ?
      JR NZ,1524  ;если да, то следующий файл
      LD HL,23782 ;сохранение части описателя файла
      LD DE,23789
      LD BC,7
      LDIR
      LD A,(23801);выбор дисковода-приемника
      CALL 15819
      CALL 7347   ;поиск файла
      JR NZ,1588  ;если  не  нашли, то  копирование
                   файла
      CALL 1460   ;проверка файла с расширением "#"
      JR NZ,1588  ;если  копируется другой блок, то
                   копируем его
      CALL 1409   ;запрос OVERWRITE ?
      JR NZ,1524  ;если  был  ответ N, то следующий
                   файл
1588  CALL 1596   ;копирование файла
      CALL 7747   ;перезапись  сектора с описателем
                   файла
      JR 1524     ;повтор до конца каталога
───────────────────────────────────────────────────
Адрес 1596. Копирование  файла при двух дисководах.
Поместите  описатель  файла  в  23773  и  его часть
в 23789.
1596  CALL 1021    ;загрузка  в буфер сектора 8 до-
                    рожки 0
      LD A,(24073) ;берем количество файлов на дис-
                    ке
      CP 128       ;уже есть 128 файлов ?
      JP Z,7237    ;если да, то NO SPACE
Ошибка!!! Надо выводить DIRECTORY FULL.
      LD HL,23789  ;восстановление  описателя файла
      LD DE,23782
      LD BC,7
      LDIR
      LD DE,(23786);берем  длину  файла  в секторах
      LD D,0
      OR A
      LD HL,(24074);берем количество свободных сек-
                    торов на диске
      SBC HL,DE    ;уменьшаем свободное место
      JP C,7237    ;если  места  не хватило,  то NO
                    SPACE
      LD (24074),HL;установка   нового   количества
                    свободных секторов
      LD HL,(24070);берем  адрес  свободного прост-
                    ранства на диске
      LD (23787),HL;установка адреса файла на диске
      PUSH HL      ;сохранение его
      CALL 1839    ;копирование файла
      POP HL       ;восстановление  адреса файла на
                    диске
      LD (23787),HL;установка его
      LD HL,(23796);берем  новый  адрес  свободного
                    места на диске
      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    ;установка описателя файла
      RET          ;возврат

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



Другие статьи номера:

Железо - Доработка Pentagon'a для работы с дисками высокой плотности HD.

Что-где-почем - pасскажу вам о пpогpаммах, котоpые я получил от VELа и Юpы.

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

Бук - похождения штиpлица и дpугие пpиключения боpмана.

Реклама - Пpодам, куплю ,обменяю пpогpаммы для ZX Spectrum.


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

Похожие статьи:
Презентация - Авторские программы: SpectrumGuide v1. 0
Письмо из FidoNet - письмо от Вячеслава Медноногова о ЧВ и Хакерах.
Lirycs - Пустой стакан ? - Пиздец застолью. Влюбись, забудь и прослезись.

В этот день...   16 июля