|
City
#19
14 июля 1999 |
|
Ликбез - полный дизассемблер ПЗУ (часть 14).

---------------------------------------------------
ЛИКБЕЗ
---------------------------------------------------
(c) П.Ю.Федин
╔═════════════════════════════════════════════════╗
║ ║
║ ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ ║
║ ║
║ TR-DOS 5.04T (5.03) ║
║ ║
║ ДЛЯ ПРОФЕССИОНАЛОВ, ║
║ ║
║ А ТАКЖЕ ДЛЯ ТЕХ, ║
║ ║
║ КТО ХОЧЕТ ИМИ СТАТЬ. ║
║ ║
╚═════════════════════════════════════════════════╝
пpодолжение
Адрес 1067. Проверка второго символа командной
строки. Вход: установите 23825. На выходе будет ус-
тановлен флаг Z, если это ENTER и сброшен, если нет
1067 LD HL,(23825);берем адрес начала строки кома-
нды
INC HL ;берем адрес ее второго символа
LD A,(HL) ;берем этот символ
CP 13 ;сравнение его с ENTER
RET ;возврат
───────────────────────────────────────────────────
Адрес 1075. Выполнение команды CAT.Установите 23825
и 23611. Используется также с адреса 1145 (вывод
каталога диска; в A - номер потока, в буфере - сек-
тор 8 дорожки 0).
1075 CALL 1067 ;второй символ строки команды
ENTER ?
LD BC,2 ;каталог выводить в поток 2
LD (23771),BC
JR Z,1130 ;если второй символ строки ENTER
то вывод каталога
CP "#" ;второй символ строки "#" ?
JR NZ,1117 ;если нет, то установка дисково-
да и вывод каталога
LD (23645),HL;установка CH_ADD на второй сим-
вол строки
CALL 7691 ;установка номера потока
CALL 7564 ;берем текущий символ
CP 13 ;это ENTER ?
JR Z,1130 ;если да, то вывод каталога
CP "," ;это запятая ?
JP NZ,7450 ;если нет, то синтаксическая
ошибка
CALL 7722 ;берем следующий символ
CALL 7613 ;помещение имени дисковода на
стек калькулятора
JR 1120 ;установка дисковода и вывод ка-
талога
1117 CALL 7647 ;установка CH_ADD и помещение
имени дисковода на стек кальку-
лятора
1120 CALL 7541 ;если строка проверяется на син-
таксис, то возврат
CALL 7605 ;снятие имени дисковода со стека
калькулятора
EX DE,HL
CALL 7297 ;установка дисковода
1130 CALL 7541 ;если проверка на синтаксис, то
возврат
LD A,(23798) ;помещение номера дисковода в
23801
LD (23801),A
CALL 1029 ;настройка на диск
LD A,(23771) ;берем номер потока
1145 CP 2 ;выводим в поток 2 ?
PUSH AF ;сохранение номера потока
CALL Z,7575 ;если назначен поток 2, то очис-
тка экрана
POP AF ;восстановление номера потока
CP 17 ;он больше 16 ?
Ошибка!!! Всего потоков 15, а не 16.
JP NC,7450 ;если да, то ошибка
CALL 7556 ;открытие потока
Ошибка!!! Надо бы проверить, подключен ли куда-ни-
будь этот поток.
LD A,255 ;установка 23800 в 255
LD (23800),A
LD HL,10743 ;печать TITLE:
RST 24
LD HL,24090 ;печать имени диска
RST 24
CALL 15744 ;перевод строки
LD A,(24073) ;вычисление количества нестертых
файлов на диске
LD HL,24089
SUB (HL)
PUSH HL
CALL 7587 ;печать его
LD HL,10795 ;печать FILES
RST 24
POP HL
LD C,(HL) ;берем количество стертых файлов
CALL 7588 ;печать его
LD HL,10781 ;печать DEL.FILES
RST 24
CALL 1000 ;загрузка в буфер сектора 0 до-
рожки 0
LD HL,23845 ;берем начало буфера
1206 CALL 1270 ;проверка достижения конца ката-
лога
CALL 15744 ;перевод строки
LD A,(23798) ;печать имени дисковода
ADD A,"A"
RST 16
LD B,2 ;печатаем по 2 имени в строке
1220 CALL 1270 ;если файл стерт, то пропуск его
PUSH BC ;сохранение количества имен фай-
лов в строке
LD A,":" ;печать двоеточия
RST 16
PUSH HL ;сохранение адреса текущего опи-
сателя файла в буфере
CALL 10552 ;печать имени и расширения файла
LD BC,13 ;вычисление адреса, по которому
находится
POP HL ;размер файла в секторах
PUSH HL
ADD HL,BC
LD C,(HL) ;берем размер файла
PUSH BC ;сохраним его
LD A,C ;перегрузим его в A
LD B,2 ;вычисление количества пробелов
перед числом
CP 10
JR C,1247
DEC B
CP 100
JR NC,1256
1251 LD A," " ;печать пробелов
RST 16
DJNZ 1251
1256 POP BC ;восстановление размера файла
CALL 7593 ;печать его
POP HL ;восстановление адреса текущего
описателя файла
POP BC ;восстановление количества имен
файлов в строке
LD DE,16 ;следующий описатель
ADD HL,DE
DJNZ 1220 ;если напечатали только 1 файл,
то печать второго
JR 1206 ;следующая строка
пpодолжение следует ...
Другие статьи номера:
Похожие статьи:
В этот день... 13 ноября