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

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


Адрес 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ат
────────────────────────────────────────────────────────────────
Адрес 5201. Копирование файла на одном дисководе. Поместите опи-
сатель файла в 23773 и его часть в 23789 и установите 23793,
23841 , 23843 и 23759. Подпрограмма устанавливает 23739, 23769,
23770 и 23698.

5201  LD A,(23793) ;все скопировали ?
      OR A
      RET Z        ;если да, то возврат
      LD A,(23841) ;первый проход ?
      OR A
      JR NZ,5231   ;если да, то диск - источник уже в дисководе
      CALL 7575    ;очистка экрана
      LD HL,10154  ;печать INSERT SOURCE DISC
      CALL 9991
5221  CALL 4178    ;ожидание клавиши Y
      CP "Y"
      JR NZ,5211
      CALL 7583    ;очистка низа экрана
5231  LD A,(23793) ;все скопировали ?
      OR A
      RET Z        ;если да, то возврат
      PUSH HL      ;сохранение HL
      LD HL,23843  ;копируется часть файла
      SUB (HL)
      POP HL       ;восстановление HL
      JR NC,5323   ;если еще не конец, то копируется часть файла
      LD A,(23793) ;копируем остаток
      LD B,A
      XOR A        ;скопировали все
      LD (23793),A
5252  PUSH BC      ;сохранение количества копируемых секторов
      LD (23758),A ;обнуление 23758
      LD HL,(23759);берем адрес рабочего пространства
      PUSH HL      ;сохраняем его
      LD DE,(23794);берем адрес копируемого участка диска
      CALL 5336    ;настройка дисковода под диск-источник
      CALL 7741    ;загрузка секторов
      LD HL,(23796);установка адреса на диске следующего сектора
      LD (23794),HL
      CALL 7575    ;очистка экрана
      LD HL,10119  ;печать INSERT DESTINATION DISC
      CALL 9991
5285  CALL 4178    ;ожидание клавиши Y
      CP "Y"
      JR NZ,5286
      CALL 7583    ;очистка низа экрана
      LD A,(23841) ;первый проход ?
      OR A
      CALL NZ,5123 ;если да, то проверка наличия места на диске
      POP HL       ;восстановление адреса рабочего пространства
      POP BC       ;и количества копируемых секторов
      LD DE,(23787);берем адрес текущего участка диска
      CALL 5348    ;настройка дисковода под диск-приемник
      CALL 7757    ;запись секторов
      LD HL,(23797);установка адреса на диске следующего сектора
      LD (23787),HL
      JP 5201      ;повтор
5323  LD (23793),A ;установка длины оставшейся части файла
      PUSH HL      ;сохранение HL
      LD HL,23843  ;берем длину рабочей области
      LD B,(HL)
      POP HL       ;восстановление HL
      XOR A        ;обнуление аккумулятора
      JP 5252      ;копирование
────────────────────────────────────────────────────────────────
Адрес 5336. Помещение значения 23769 в переменную режима диско-
вода. Установите 23769.

5336  PUSH HL     ;сохранение DE и HL
      PUSH DE
      CALL 15889  ;берем адрес переменной с типом дисковода
      LD A,(23769);берем тип дисковода из 23769
      LD (HL),A   ;установка типа дисковода
      POP DE      ;восстановление DE и HL
      POP HL
      RET         ;возврат
────────────────────────────────────────────────────────────────
Адрес 5348. Помещение значения 23770 в переменную режима диско-
вода. Установите 23770.

5348  PUSH HL     ;сохранение DE и HL
      PUSH DE
      CALL 15889  ;берем адрес переменной с типом дисковода
      LD A,(23770);берем тип дисковода из 23769
      LD (HL),A   ;установка типа дисковода
      POP DE      ;восстановление DE и HL
      POP HL
      RET         ;возврат
────────────────────────────────────────────────────────────────
Адрес 5360. Проверка наличия места на диске-приемнике для коман-
ды COPY B. Установите 23775 и поместите в дисковод диск-прием-
ник. Устанавливает 23770, 23783, 23773 и обнуляет 23841.

5360  XOR A        ;обнуление 23841
      LD (23841),A
      CALL 1029    ;настройка на диск
      CALL 15889   ;берем режим дисковода
      LD (23770),A ;сохраняем его
      LD A,(24072) ;сохраняем тип диска
      LD (23783),A
      LD HL,640    ;вычисление количества секторов на
      CP 25        ;диске-приемнике
      JR Z,5407
      LD HL,1260
      CP 24
      JR Z,5407
      CP 23
      JR Z,5407
      LD HL,2560
      CP 22
      JR Z,5407
      JP 7540      ;если в качестве типа диска стоит неопределенное значение,
                    то *ERROR*

Лучше DISC ERROR.

5407  LD (23773),HL;сохранение количества секторов на диске-приемнике
      LD BC,(23775);берем количество копируемых секторов
      SBC HL,BC    ;места хватит ?
      JP C,7237    ;если нет, то NO SPACE
      RET          ;возврат
────────────────────────────────────────────────────────────────
Адрес 5420. Выполнение команды COPY B. Установите 23611.

5420  CALL 7541    ;если идет проверка на синтаксис, то возврат
      CALL 5743    ;резервирование места в памяти
      LD HL,10105  ;печать BACKUP DISC
      CALL 9991
      LD HL,10154  ;печать INSERT SOURCE DISC
      CALL 9991
5438  CALL 4173    ;ввод клавиши
      CP "Y"       ;это Y ?
      JR NZ,5438   ;если да, то повтор
      CALL 7583    ;очистка низа экрана
      LD A,255     ;первый проход
      LD (23841),A

Внимание!!! Эта переменная уже занята. В ней хранятся первые 3
символа командной строки.

      CALL 1029    ;настройка на диск
      CALL 15889   ;берем режим дисковода
      LD (23769),A ;сохраняем его
      LD A,(24072) ;берем тип диска
      CP 25        ;диск 40-дорожечный односторонний ?
      LD HL,640    ;всего на диске 640 секторов
      JR Z,5493    ;если да, то копирование
      LD HL,1280   ;всего на диске 1280 секторов
      CP 24        ;диск 80-дорожечный односторонний ?
      JR Z,5493    ;если да, то копирование
      CP 23        ;диск 40-дорожечный двухсторонний ?
      JR Z,5493    ;если да, то копирование
      LD HL,2560   ;всего на диске 2560 секторов
      CP 22        ;диск 80-дорожечный двухсторонний ?
      JR Z,5493    ;если да, то копирование
      JP 7450      ;иначе *ERROR*

Внимание!!! Лучше выдавать сообщение DISC ERROR.

5493  LD BC,(24074);берем количество свободных секторов
      SBC HL,BC    ;вычисляем количество занятых секторов
      LD (23781),HL;установка количества секторов
      LD (23775),HL
      LD HL,0      ;скопировано 0 секторов
      LD (23777),HL
      LD (23779),HL
      CALL 5560    ;копирование секторов
      CALL 1029    ;настройка на диск
      LD A,(23783) ;установка нового типа диска-приемника
      LD (24072),A
      LD HL,(23773);берем общее число секторов на диске-приемнике
      LD BC,(23775);берем число скопированных секторов
      SBC HL,BC    ;вычисление числа свободных секторов на диске - приемнике
      LD (24074),HL;установка его
      CALL 5348    ;настройка дисковода под диск-приемник
      LD DE,9      ;записывали сектор 8 дорожки 0
      LD (23796),DE
      CALL 7747    ;запись сектора
      JP 993       ;O.K.
────────────────────────────────────────────────────────────────
Адрес 5554. Проверка переменной 23781. Соответственно содержимо-
му будет установлен флаг Z, а само содержимое будет в HL.

5554  LD HL,(23781);берем содержимое переменной 23781
      LD A,H       ;проверка его на 0
      OR L
      RET          ;возврат
────────────────────────────────────────────────────────────────
Адрес 5560. Копирование секторов. Установите 23769, 23759,
23781, 23841, 23843 и 23771

5560  CALL 5554    ;все скопировали ?
      RET Z        ;если да, то возврат
      LD A,(23841) ;первый проход ?
      OR A
      JR NZ,5595   ;если да, то диск-источник уже в дисководе
      LD HL,10505  ;печать BACKUP DISC
      CALL 9991
      LD HL,10154  ;печать INSERT SOURCE DISC
      CALL 9991
5585  CALL 4178    ;ожидание нажатия Y
      CP "Y"
      JR NZ,5585
      CALL 7583    ;очистка низа экрана
5595  CALL 5554    ;все скопировали ?
      RET Z        ;если да, то возврат
      PUSH BC      ;сохранение BC и количества секторов
      PUSH HL
      LD HL,23843  ;берем длину рабочей области в секторах
      LD C,(HL)
      LD B,0
      POP HL       ;восстановление количества секторов
      SBC HL,BC    ;уменьшение количества секторов
      POP BC       ;восстановление BC
      JP NC,5700   ;если рабочего пространства мало, то это еще не конец
      LD BC,(23781);берем оставшееся количество секторов
      LD HL,0      ;все скопировали
      LD (23781),HL
5624  PUSH BC      ;сохранение количества секторов
      LD HL,(23759);берем адрес рабочей области
      PUSH HL      ;сохраняем его
      CALL 5336    ;настройка дисковода под диск-источник
      LD DE,(23771);берем адрес группы секторов на диске-источнике
      LD B,C
      CALL 7741    ;загрузка секторов
      LD HL,(23796);установка адреса следующей группы секторов
      LD (23771),HL;на диске-источнике
      CALL 7575    ;очистка экрана
      LD HL,10105  ;печать BACKUP DISC
      CALL 9991
      LD HL,10117  ;печать INSERT DESTINATION DISC
      CALL 9991
5661  CALL 4178    ;ожидание нажатия Y
      CP "Y"
      JR NZ,5601
      CALL 7583    ;очистка низа экрана
      LD A,(23841) ;первый проход ?
      OR A
      CALL NZ,5360 ;если да, то проверка наличия места на диске
      POP HL       ;восстановление адреса рабочей области
      POP BC       ;и количества копируемых секторов
      LD DE,(23779);берем адрес группы секторов на диске-приемнике
      LD B,C
      CALL 5348    ;настройка дисковода под диск-приемник
      CALL 7757    ;запись секторов
      LD HL,(23796);установка адреса следующей группы секторов
      LD (23779),HL;на диске-приемнике
      JP 5560      ;повтор
5700  LD (23871),HL;установка оставшегося количества секторов
      PUSH HL      ;сохранение его
      LD HL,(23843);берем длину рабочей области
      LD C,(HL)    ;столько секторов будем копировать
      LD B,0
      POP HL       ;восстановление оставшегося количества секторов
      XOR A        ;обнуление аккумулятора
      JP 5624      ;копирование
────────────────────────────────────────────────────────────────
Адрес 5715. Проверка состояния файла. Номер файла задайте в ре-
гистре A. Возвращает Z, если файл стерт и NZ, если нет, а в A
будет первый символ имени файла.

5715  CALL 5725   ;чтение описателя файла
      LD A,(23773);берем первый символ имени файла
      CP 1        ;проверка состояния файла
      RET         ;возврат




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Авторы - авторы газеты.
Moзаика - "Virus-2" - если не работает управление в игре...
LPRINT - Стандартный формат текстов, принятый в газете.
Реклама - Реклама и объявления ...
Беседы при свечах - Андрей Чертков - Вячеслав Рыбаков.

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