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

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


Адрес 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.
────────────────────────────────────────────────────────────────
Адрес 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          ;возврат
────────────────────────────────────────────────────────────────
Адрес 1680. Выполнение команды COPY. Установите 23825 и 23611.

1680  LD HL,(23825);берем адрес второго символа командной строки
      INC HL
      LD A,(HL)    ;берем этот символ
      AND 223      ;буква заглавная
      CP "S"       ;это "S" ?
      JP Z,4960    ;если да, то копируем 1 файл на одном дисководе
      CP "B"       ;это "B" ?
      JP Z,5420    ;если да, то копирование всего диска на одном дисководе
      CALL 7629    ;прием имен файлов
      CALL 7541    ;если идет проверка на синтаксис, то возврат
      CALL 5743    ;выделение места в памяти
      CALL 4142    ;прием расширения файла
      CALL 7344    ;установка старого имени файла
      LD A,(23798) ;сохранение номера дисковода - источника
      LD (23800),A
      JP NZ,1483   ;если файл не найден, то проверка COPY "*","*"

Ошибка!!! COPY "*","*" надо проверять всегда, иначе при наличии
на диске файла с именем "*" скопируется только этот файл, а в
целом тут должно быть так:
LD (23800),A
PUSH AF
CALL 1483
POP AF
JP NZ,985
А в подпрограмме 1483 вместо JP NZ,985 должно быть RET NZ.

      CALL 5725    ;чтение описателя файла
      LD HL,23782  ;сохранение его части
      LD DE,23789
      LD BC,7
      LDIR
      CALL 7344    ;установка нового имени файла
      PUSH AF      ;сохранение результата проверки
      PUSH BC      ;и номера файла
      LD A,(23798) ;сохранение номера дисковода - приемника
      LD (23801),A
      LD A,(23800) ;выбор дисковода - источника
      CALL 15819
      CALL 1029    ;настройка на диск
      LD A,(23801) ;выбор дисковода - приемника
      CALL 15819
      CALL 1029    ;настройка на диск
      POP BC       ;восстановление номера файла
      POP AF       ;и результата проверки нового имени файла
      JR NZ,1779   ;если файл не найден, то копирование файла
      CALL 1460    ;проверка файла с расширением "#"
      JR NZ,1779   ;если копируется другой блок, то копируем его
      CALL 1409    ;запрос OVERWRITE ?
      JP NZ,993    ;если был ответ N, то O.K.
1779  CALL 1596    ;копирование файла
      CALL 7747    ;перезапись сектора с описателем файла
      LD A,(23781) ;берем расширение файла
      CP "#"       ;это "#" ?
      JP NZ,993    ;если нет, то O.K.
      LD A,10      ;файл искать по 10 байтам
      LD (23814),A
      LD HL,23782  ;следующий блок
      INC (HL)
      LD A,(23800) ;выбор дисковода - источника
      CALL 15819
      CALL 1460    ;поиск блока
      JP NZ,993    ;если не нашли, то O.K.
      CALL 5725    ;чтение его описателя
      LD HL,23782  ;сохранение его части
      LD DE,23789
      LD BC,7
      LDIR
      LD A,(23801) ;выбор дисковода - приемника
      CALL 15819
      CALL 1029    ;настройка на диск
      JR 1779      ;повтор
────────────────────────────────────────────────────────────────
Адрес 1839. Копирование файла при двух дисководах. Установите
23793, 23843, 23800, 23801, 23794, 23759 и 23787.

1839  LD A,(23793) ;берем количество секторов
      OR A         ;все скопировали ?
      RET Z        ;если да, то возврат
      PUSH HL      ;сохранение HL
      LD HL,23843  ;адрес переменной с длиной рабочей области памяти
      SUB (HL)     ;области хватит ?
      POP HL       ;восстановление HL
      JR NC,1909   ;если рабочей области не хватит, то копируем часть файла
      LD A,(23793) ;копируем весь остаток
      LD B,A
      XOR A        ;скопировали все
      LD (23793),A
1860  PUSH BC      ;сохранение количества копируемых сектоpов
      LD A,(23800) ;выбор дисковода-источника
      CALL 15819
      POP BC       ;восстановление количества копируемых секторов
      PUSH BC      ;и снова сохранение его
      LD HL,(23759);берем адрес рабочей области памяти
      PUSH HL      ;сохраняем его
      LD DE,(23794);берем адрес части файла на диске-источнике
      CALL 7741    ;загрузка секторов
      LD HL,(23796);установка адреса следующей группы секторов
      LD (23794),HL;на диске-источнике
      LD A,(23801) ;выбор дисковода-приемника
      CALL 15819
      POP HL       ;восстановление адреса рабочей области памяти
      POP BC       ;и количества копируемых секторов
      LD DE,(23787);берем адрес части файла на диске-приемнике
      CALL 7757    ;запись секторов
      LD HL,(23796);установка адреса следующей группы секторов
      LD (23787),HL;на диске-приемнике
      JR 1839      ;повтор
1909  LD (23793),A ;установка оставшегося количества секторов
      PUSH HL      ;сохранение HL
      LD HL,23843  ;копируем столько секторов, сколько
      LD B,(HL)    ;поместится в рабочую область
      POP HL       ;восстановление HL
      XOR A        ;обнуление аккумулятора
      JR 1860      ;копирование секторов




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Введение - Об изменениях в оболочке газеты.
Фантастика - Что такое искусственныый pазум?
Демопати - первые полные результаты Chaos Construction'2000.
Поэзия - Утро хакера.
ASCII 2007 - список работ и авторов.

В этот день...   19 апреля