City #23
06 августа 1999

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

                                                  
         ▒▒▒  ▒   ▒  ▒  ▒  ▒▒▒▒  ▒▒▒▒   ▒▒        
        ▒┌ ▒│ ▒│  ▒│ ▒│▒┌┘ ▒┌──┘ ▒┌──┘ ▒┌ ▒│      
        ▒│ ▒│ ▒│ ▒▒│ ▒▒┌┘  ▒▒▒▒  ▒▒▒     ▒┌┘      
        ▒│ ▒│ ▒│▒ ▒│ ▒ ▒   ▒┌ ▒│ ▒┌─┘     ▒       
        ▒│ ▒│ ▒▒┌┘▒│ ▒│ ▒  ▒│ ▒│ ▒│    ▒  ▒│      
        ▒│ ▒│ ▒┌┘ ▒│ ▒│ ▒│ ▒▒▒▒│ ▒▒▒▒   ▒▒┌┘      
         ┘  ┘  ┘   ┘  ┘  ┘  ───┘  ───┘   ─┘   

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

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

                   пpодолжение

  Адрес 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
      *OR 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
      *OR A        ;обнуление аккумулятора
      JR 1860      ;копирование секторов

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




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

Похожие статьи:
PartyZone! - MILLENnIUM PARTY Результаты.
Interface - gaming like it used to be! (cronosoft interview)
Тест - я не педик!

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