|
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одолжение следует ...
Другие статьи номера:
Похожие статьи:
В этот день... 15 ноября