City #50
19 ноября 2000

Ликбез - ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ TR-DOS 5.04 (5.03).

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

  ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ TR-DOS 5.04 (5.03)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ДЛЯ ПРОФЕССИОНАЛОВ, А ТАКЖЕ ДЛЯ ТЕХ, КТО ХОЧЕТ ИМИ СТАТЬ
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                          продолжение

Адрес 7852. Вычисление количества полных секторов файла  из  его
длины в байтах. В A должно быть количество  секторов  файла, а в
DE - длина загружаемой части файла.
7852  PUSH HL    ;сохранение HL
      LD H,A     ;берем полную длину файла
      LD L,0
      PUSH HL    ;сохраняем ее
      SBC HL,DE  ;она меньше длины загрузки ?
      CALL C,7868;если да, то загружать весь файл
      POP HL     ;восстановление полной длины файла
      LD A,H     ;вычисление количества полных секторов  из пол-
                 ной длины файла
      POP HL     ;восстановление HL
      RET C      ;если полная длина файла больше длины загрузки,
      LD A,D     ;то количество полных секторов  берем  из длины
                  загрузки
      RET        ;возврат
────────────────────────────────────────────────────────────────
Адрес 7868. Обнуление 23766 и установка флага C.
7868  XOR A
      LD (23766),A
      SCF
      RET
────────────────────────────────────────────────────────────────
Адрес 7874. Выполнение команды FORMAT. Установите 23825 и 23611.
Используется также с адреса 7901 (повтор форматирования; устано-
вите 23773).
7874  LD HL,65535
      LD (23767),HL;дорожки не проверять
      LD (23769),HL;форматировать одну сторону диска
      LD (23761),HL;ошибку при чтении адресного маркера игнори-
                    ровать
      CALL 1067    ;следующий символ ENTER ?
      JP Z,7450    ;если да, то ошибка
      CALL 7647    ;прием имени диска на стек калькулятора
      CALL 7541    ;если идет проверка на синтаксис, то возврат
      CALL 7255    ;установка имени диска
7901  CALL 12800   ;выбор быстрого или обычного формата
      AND 128      ;дисковод 40-дорожечный ?
      LD A,40      ;форматировать 40 дорожек
      JR Z,7192    ;если дисковод 80-дорожечный,
      LD A,80      ;то форматировать 80 дорожек
7192  LD (23767),A ;установка количества дорожек
      CALL 15768   ;восстановление
      CALL 8182    ;выбор нижней стороны диска
      CALL 16032   ;задержка в 2168937 тактов
      LD E,1       ;форматирование дорожки с номером 1
      CALL 8189
      CALL 8171    ;выбор верхней стороны диска
      LD E,0       ;форматирование дорожки с номером 0
      CALL 8189
      LD A,(23773) ;форматировать только одну сторону диска
      CP "$"
      JR Z,7963    ;если да, то форматирование диска
      CALL 8182    ;выбор нижней стороны диска
      CALL 16032   ;задержка в 2168937 тактов
      CALL 16053   ;чтение адресного маркера
      LD A,H       ;номер дорожки - 1 ?
      CP 1
      JR NZ,7963   ;если нет, то форматирование диска
      LD A,128     ;форматировать обе стороны диска
      LD (23770),A
7963  CALL 8381    ;форматирование диска
      LD HL,23845  ;адрес начала буфера
      LD (HL),0    ;очистка первого байта
      LD DE,23846  ;адрес второго байта буфера
      LD BC,255    ;осталось очистить 255 байтов
      LDIR         ;очистка буфера
      LD BC,23767  ;адрес переменной с количеством дорожек
      LD DE,23770  ;адрес переменной с количеством сторон
      LD A,(BC)    ;форматировали 80 дорожек ?
      CP 80
      JR Z,8009    ;если да, то диск 80-дорожечный
      LD A,(DE)    ;форматировали 2 стоpоны ?
      CP 128
      JR Z,8002    ;если да, то диск 40-дорожечный двухстоpонний
      LD A,25      ;диск 40-дорожечный односторонний
      LD HL,624    ;свободно 624 сектора
      JR 8021      ;создание описателя диска
8002  LD A,23      ;диск 40-дорожечный двухсторонний
8004  LD HL,1264   ;свободно 1264 сектора
      JR 8021      ;создание описателя диска
8009  LD A,(DE)    ;форматировали 2 стороны ?
      CP 128
      LD A,24      ;если нет, то диск 80-дорожечный  односторон-
                    ний
      JR NZ,8004
      LD A,22      ;иначе диск 80-дорожечный двухсторонний
      LD HL,2544   ;свободно 2544 сектора
8021  LD (24072),A ;установка типа диска
      LD (24074),HL;установка количества свободных секторов
      LD A,1       ;первая свободная дорожка - 1
      LD (24071),A
      LD A,16      ;признак принадлежности диска к TR-DOS
      LD (24076),A
      LD HL,24079  ;9 байтов 32 с адреса 24079
      LD DE,24080
      LD BC,8
      LD (HL),32
      LDIR
      LD HL,23773  ;установка имени диска
      LD DE,24090
      LD BC,8
      LDIR
      CALL 8171    ;выбор верхней стороны диска
      LD B,1       ;записать 1 сектор
      LD DE,8      ;сектор 8 дорожки 0
      LD HL,23845  ;из буфера
      CALL 7778    ;запись сектора
      LD A,(23766) ;берем количество дефектных секторов
      PUSH AF      ;сохраняем его
      XOR A        ;расширение - CHR$ 0
      CALL 12996   ;установка расширения и очистка низа экрана
      LD HL,(24074);берем количество свободных секторов
      LD (23767),HL;сохраняем его
      LD HL,23773  ;печать имени диска
      RST 24
      LD A,13      ;перевод строки
      RST 16
      LD HL,(23767);восстановление количества свободных секторов
      POP AF       ;восстановление количества дефектных секторов
      PUSH HL      ;сохранение количества свободных секторов
      LD D,0       ;перевод количества дефектных секторов в
      LD E,A       ;двухбайтную форму
      SBC HL,DE    ;вычисление количества хороших секторов
      LD B,H       ;переброска его в BC
      LD C,L
      CALL 7593    ;печать его
      LD A,"/"     ;печать "/"
      RST 16
      POP BC       ;восстановление количества свободных секторов
      CALL 7593    ;печать его
      JP 12907     ;запрос повтора форматирования
────────────────────────────────────────────────────────────────
Адрес 8121. Таблица секторов для форматирования обычного диска.
Используется также с адреса 8122 для проверки дорожки.
8121  DEFB 1
8122  DEFB 9,2,10,3,11,4,12,5,13,6,14,7,15,8,16,1

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




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

Похожие статьи:
Хит-Парад - Десятка самых популярных программ в Чайковском.
Stuff - авторы газеты.
AUTOCONF - AUTOCONFIG расширеной памяти нужен всем.

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