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