City #37
17 декабря 1999

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

┌─────────────────────────────────────────────────┐
│    *************   ЛИКБЕЗ   ****************    │
└─────────────────────────────────────────────────┘

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

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

                   пpодолжение

Адрес 6308.  Чтение  описателя  файла,  если он был
найден. Установите 23773, 23781 и  флаг Z:  при Z=1
происходит чтение описателя, иначе ошибка NO FILE.
6308  JP NZ,985;если перед вызовом файл не был най-
                ден, то ошибка
      CALL 5725;загрузка описателя файла
      RET      ;возврат
───────────────────────────────────────────────────
Адрес 6315.  Обработка  параметров для подпрограммы
загрузки файла.  На входе установите 23766, 23769 и
23771; считайте описатель нужного вам файла. На вы-
ходе  в  23771  будет  длина  файла для загрузки, в
23766 - 0, если длина менялась, иначе 3. В HL будет
адрес загрузки файла,  в DE - его адрес на диске, в
B - количество секторов для загрузки.  При загрузке
массива или  программы на бейсике будет произведена
подготовка памяти к загрузке.
6315  LD A,(23766) ;берем флаг загрузки
      OR A         ;начало и длину брать из катало-
                    га ?
      LD HL,(23782);берем начало файла из описателя
      JR Z,6327    ;если параметры  берем не из ка-
                    талога, то
      LD HL,(23769);берем  начальный  адрес, назна-
                    ченный нами
6327  LD DE,(23787);берем адрес файла на диске
      CP 3         ;все параметры назначены пользо-
                    вателем?
      LD A,(23786) ;берем  размер  файла в секторах
      PUSH DE      ;сохранение адреса файла на дис-
                    ке
      LD DE,(23784);берем длину файла из  описателя
      JR NZ,6347   ;если  нужно брать ее не оттуда,
                    то берем
      LD DE,(23771);длину загрузки, назначенную на-
                    ми
6347  LD B,A       ;сохранение размера файла в сек-
                    торах
      LD (23771),DE;установка длины файла для  заг-
                    рузки
      LD A,(23781) ;расширение файла C?
      CP "C"
      LD A,B       ;восстановление  длины  файла  в
                    секторах
      JR NZ,6397   ;если расширение не C, то  длину
                    не менять
      LD A,B       ;если длина файла в байтах соот-
                    ветствует его
      CP D         ;размеру  в  секторах,  то длина
                    загрузки не меняется
      JR Z,6390    
      DEC A
      CP D
      LD A,B
      JR Z,6390
      LD A,(23766) ;длина назначена пользователем ?
      CP 3
      LD A,B       ;восстановление  размера файла в
                    секторах
      JR Z,6390    ;если  мы  сами  назначили длину
                    загрузки,  то  она  не меняется
      XOR A        ;грузить только полностью запол-
                    ненные сектора
      LD (23766),A
      LD D,B       ;вычисление длины файла в байтах
                    из его длины
      LD E,0       ;в секторах
      LD (23771),DE;установка новой длины
      JR 6393
6390  CALL 6427    ;файл загружать весь
6393  LD A,B       ;восстановление  размера файла в
                    секторах
      CALL 7852    ;вычисление  количества секторов
                    для загрузки
      LD B,A       ;сохранение его
      LD A,(23781) ;расширение файла C ?
      CP "C"
      POP DE       ;восстановление адреса  файла на
                    диске
      RET Z        ;если расширение файла C,то воз-
                    врат
Ошибка!! Если выполняется чтение или запись сектора
файла,  то  здесь  должен  быть возврат. Из-за этой
ошибки нельзя прочитать или записать сектор файла с
расширением B или D.
      PUSH DE      ;сохранение адреса файла на дис-
                    ке
      CP "B"       ;расширение B ?
      PUSH AF      ;сохранение   расширения   файла
      CALL Z,6657  ;если расширение B, то подготов-
                    ка   к     загрузке   программы
                   ;на бейсике
      POP AF       ;восстановление расширения
      CP "D"       ;расширение D ?
      CALL Z,6732  ;если да, то подготовка к загру-
                    зке массива
      CALL 6427    ;длина загрузки не менялась
      LD A,(23772) ;берем  количество  секторов для
                    загрузки
      LD B,A
      POP DE       ;восстановление  адреса файла на
                    диске
      RET          ;возврат

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




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

Похожие статьи:
Scene - мысли вслух: "Ха. А для чего тогда 'делиться мыслями'?! Пpосто так - лишь бы языком почесать? Я ещё pаз повтоpяю то, с чем ты упоpно не хочешь соглашаться не знаю почему: твоpчеству HИКТО и HИКАКИМИ мыслями не поможет." статья от Manwe.
CREDITZЬ - Здeсь писaно про всeх кто приложылся к fpl-2.
От авторов - От Wlodek`а.

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