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

---------------------------------------------------
ЛИКБЕЗ
---------------------------------------------------
(c) П.Ю.Федин
╔═════════════════════════════════════════════════╗
║ ║
║ ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ ║
║ ║
║ TR-DOS 5.04T (5.03) ║
║ ║
║ ДЛЯ ПРОФЕССИОНАЛОВ, ║
║ ║
║ А ТАКЖЕ ДЛЯ ТЕХ, ║
║ ║
║ КТО ХОЧЕТ ИМИ СТАТЬ. ║
║ ║
╚═════════════════════════════════════════════════╝
пpодолжение
Адрес 1409. Запрос на стирание файла. Установите
23773 и 23798, а в регистр C поместите номер файла.
При ответе Y файл будет стерт и включится флаг Z,
иначе он будет выключен.
1409 PUSH BC ;сохранение номера файла
CALL 7575 ;очистка экрана и открытие по-
тока 0.
LD A,(23798);берем номер дисковода
ADD A,"A" ;вычисляем имя дисковода
CALL 15746 ;печать его
LD A,":" ;печать двоеточия
CALL 15746
LD HL,23773 ;адрес переменной с именем и рас-
ширением файла
CALL 10552 ;печать имени и расширения файла
LD HL,10272 ;печать FILE EXISTS. OVERWRITE ?
CALL 9991
CALL 4178 ;ввод клавиши
CP "Y" ;это "Y" ?
PUSH AF ;сохранение результата проверки
CALL 7575 ;очистка экрана
POP AF ;восстановление AF и номера файла
POP BC
RET NZ ;если был ответ N, то возврат
PUSH BC ;сохранение номера файла
CALL 7575 ;очистка экрана
POP BC ;восстановление номера файла
CALL 1921 ;стирание файла
XOR A ;включение флага Z
RET ;возврат
───────────────────────────────────────────────────
Адрес 1460. Проверка на существование блока файла с
расширением #. Установите 23773, 23781 и 23782. Ес-
ли блок найден или у файла другое расширение, то
включается флаг Z, иначе он будет выключен.
1460 LD A,(23781);берем расширение файла
CP "#" ;это "#" ?
JR Z,1469 ;если нет, то
XOR A ;включение флага Z
RET ;и возврат
1469 LD A,10 ;файл ищем по 10 байтам
LD (23814),A
CALL 7347 ;поиск файла
LD A,9 ;файл ищем по 9 байтам
LD (23814),A
RET ;возврат
───────────────────────────────────────────────────
Адрес 1483. Выполнение команды COPY"*","*". Первую
звездочку поместите в 23773, вторую - на стек каль-
кулятора и установите 23800, 23843 и 23759.
1483 LD A,(23773);берем первый символ имени файла
CP "*" ;это "*" ?
JP NZ,985 ;если нет, то NO FILE
CALL 7605 ;снятие строки со стека калькуля-
тора
EX DE,HL
CALL 7297 ;установка дисковода-приемника
LD A,(HL) ;берем следующий символ строки
CP "*" ;это "*" ?
JP NZ,7450 ;если нет, то ошибка
LD A,(23798);сохранение номера дисковода-при-
емника
LD (23801),A
1524 LD A,(23801);выбор дисковода-приемника
CALL 15819
CALL 1029 ;настройка на диск
LD A,255 ;начнем с файла 0
LD (23821),A
LD A,(23800);выбор дисковода-источника
CALL 15819
CALL 1029 ;настройка на диск
LD A,(23821);следующий файл
INC A
LD (23821),A
LD C,A
CALL 5725 ;чтение его описателя
LD A,(23773);берем первый символ его имени
CP 0 ;это конец каталога ?
JP Z,993 ;если да, то O.K.
CP 1 ;файл стерт ?
JR NZ,1524 ;если да, то следующий файл
LD HL,23782 ;сохранение части описателя файла
LD DE,23789
LD BC,7
LDIR
LD A,(23801);выбор дисковода-приемника
CALL 15819
CALL 7347 ;поиск файла
JR NZ,1588 ;если не нашли, то копирование
файла
CALL 1460 ;проверка файла с расширением "#"
JR NZ,1588 ;если копируется другой блок, то
копируем его
CALL 1409 ;запрос OVERWRITE ?
JR NZ,1524 ;если был ответ N, то следующий
файл
1588 CALL 1596 ;копирование файла
CALL 7747 ;перезапись сектора с описателем
файла
JR 1524 ;повтор до конца каталога
───────────────────────────────────────────────────
Адрес 1596. Копирование файла при двух дисководах.
Поместите описатель файла в 23773 и его часть
в 23789.
1596 CALL 1021 ;загрузка в буфер сектора 8 до-
рожки 0
LD A,(24073) ;берем количество файлов на дис-
ке
CP 128 ;уже есть 128 файлов ?
JP Z,7237 ;если да, то NO SPACE
Ошибка!!! Надо выводить DIRECTORY FULL.
LD HL,23789 ;восстановление описателя файла
LD DE,23782
LD BC,7
LDIR
LD DE,(23786);берем длину файла в секторах
LD D,0
OR A
LD HL,(24074);берем количество свободных сек-
торов на диске
SBC HL,DE ;уменьшаем свободное место
JP C,7237 ;если места не хватило, то NO
SPACE
LD (24074),HL;установка нового количества
свободных секторов
LD HL,(24070);берем адрес свободного прост-
ранства на диске
LD (23787),HL;установка адреса файла на диске
PUSH HL ;сохранение его
CALL 1839 ;копирование файла
POP HL ;восстановление адреса файла на
диске
LD (23787),HL;установка его
LD HL,(23796);берем новый адрес свободного
места на диске
LD (24070),HL;установка его
LD HL,24073 ;записали 1 файл
INC (HL)
LD C,(HL) ;берем номер записываемого файла
DEC C
LD B,0
PUSH BC ;сохраняем его
LD DE,9 ;записывать сектор 8 дорожки 0
LD (23796),DE
CALL 7747 ;запись сектора
POP BC ;восстановление номера файла
CALL 5739 ;установка описателя файла
RET ;возврат
продолжение следует ...
Другие статьи номера:
Похожие статьи:
В этот день... 16 ноября