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

┌─────────────────────────────────────────────────┐
│ ************** ЛИКБЕЗ ***************** │
└─────────────────────────────────────────────────┘
(c) П.Ю.Федин
╔═════════════════════════════════════════════════╗
║ ║
║ ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ ║
║ ║
║ TR-DOS 5.04T (5.03) ║
║ ║
║ ДЛЯ ПРОФЕССИОНАЛОВ, ║
║ ║
║ А ТАКЖЕ ДЛЯ ТЕХ, ║
║ ║
║ КТО ХОЧЕТ ИМИ СТАТЬ. ║
║ ║
╚═════════════════════════════════════════════════╝
пpодолжение
Адрес 4960. Выполнение команды COPY S. Установите
23825 и 23611.
4960 CALL 7621 ;установка CH_ADD
CALL 7722 ;следующий символ
CALL 7613 ;прием имени файла на стек каль-
кулятора
CALL 7541 ;если идет проверка на синтаксис,
то возврат
CALL 5743 ;резервирование места в памяти
LD HL,10154 ;печать INSERT SOURCE DISC
CALL 9991
4981 CALL 4178 ;ввод символа с клавиатуры
CP "Y" ;это Y ?
JR NZ,4981 ;если нет, то повтор
CALL 7583 ;очистка низа экрана
CALL 4142 ;прием расширения файла
CALL 7344 ;установка имени файла
JP NZ,985 ;если такого файла нет, то ошиб-
ка
CALL 5047 ;копирование файла
LD A,(23781);расширение файла # ?
CP "#"
JP NZ,993 ;если нет, то O.K.
5011 LD A,10 ;файл искать по 10 символам
LD (23814),A
LD HL,23782 ;следующий блок
INC (HL)
CALL 7575 ;очистка экрана
LD HL,10154 ;печать INSERT SOURCE DISC
CALL 9991
5029 CALL 4178 ;ввод клавиши
CP "Y" ;это Y ?
JR NZ,5029 ;если да, то повтор
CALL 7347 ;поиск блока
JP NZ,993 ;если не нашли, то O.K.
CALL 5047 ;копирование блока
JR 5011 ;повтор
───────────────────────────────────────────────────
Адрес 5047. Копирование файла при одном дисководе.
Номер файла поместите в регистр C.
5047 CALL 5725 ;чтение описателя файла
LD HL,23782 ;сохранение его части
LD DE,23789
LD BC,7
LDIR
LD A,(23793) ;установка объема файла в секто-
рах
LD (23824),A
CALL 1029 ;настройка на диск
CALL 15889 ;сохранение режима дисковода
LD (23769),A
LD A,255 ;первый проход
LD (23841),A
Внимание!! Эта переменная уже занята. В ней хранят-
ся первые 3 символа командной строки.
CALL 5201 ;копирование файла
LD HL,(23839) ;берем адрес файла на диске -
приемнике
LD (23787),HL ;устанавливаем его
LD HL,(23698) ;берем новый адрес свободного
места на диске
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 ;чтение и замена описателя фай-
ла
CALL 7747 ;запись сектора с описателем
RET ;возврат
───────────────────────────────────────────────────
Адрес 5123. Проверка наличия свободного места на
диске-приемнике для команды COPY S. Поместите опи-
сатель файла в 23773 и его часть в 23789 и устано-
вите 23824. В дисководе должен быть диск-приемник.
Подпрограмма устанавливает 23786, 23787 и 23839.
5123 XOR A ;не первый проход
LD (23841),A
CALL 1029 ;настройка на диск
CALL 15889 ;берем режим дисковода
LD (23770),A ;сохраняем его
CALL 7347 ;поиск файла
JP Z,7248 ;если нашли, то FILE EXISTS
CALL 1021 ;загрузка в буфер сектора 8 до-
рожки 0
LD A,(24073) ;берем количество файлов на дис-
ке
CP 128 ;их 128 ?
JP Z,10019 ;если да, то DIRECTORY FULL
LD HL,23789 ;восстановление описателя файла
LD DE,23782
LD BC,7
LDIR
CALL 1021 ;загрузка в буфер сектора 8 до-
рожки 0
LD A,(23824) ;восстановление длины файла в
секторах
LD (23786),A
LD DE,(23786);перевод ее в двухбайтную форму
LD D,0
OR A ;сброс флага C
LD HL,(24074);уменьшаем свободное место на
диске
SBC HL,DE
JP C,7237 ;если его не хватило,то NO SPACE
LD (24074),HL;установка нового количества
свободного места на диске
LD HL,(24070);берем адрес свободного места на
диске
LD (23787),HL;установка адреса файла на диске
- приемнике
LD (23839),HL;сохранение его
Боже мой!!! Hу что это такое! Ведь эта переменная -
флаг способа вызова TR-DOS. И на такой DOS все ра-
ботают. Ужас какой-то.
RET ;возвpат
пpодолжение следует ...
Другие статьи номера:
Похожие статьи:
В этот день... 16 ноября