|
City
#23
06 августа 1999 |
|
Ликбез - полный дизассемблер ПЗУ (часть 15).

▒▒▒ ▒ ▒ ▒ ▒ ▒▒▒▒ ▒▒▒▒ ▒▒
▒┌ ▒│ ▒│ ▒│ ▒│▒┌┘ ▒┌──┘ ▒┌──┘ ▒┌ ▒│
▒│ ▒│ ▒│ ▒▒│ ▒▒┌┘ ▒▒▒▒ ▒▒▒ ▒┌┘
▒│ ▒│ ▒│▒ ▒│ ▒ ▒ ▒┌ ▒│ ▒┌─┘ ▒
▒│ ▒│ ▒▒┌┘▒│ ▒│ ▒ ▒│ ▒│ ▒│ ▒ ▒│
▒│ ▒│ ▒┌┘ ▒│ ▒│ ▒│ ▒▒▒▒│ ▒▒▒▒ ▒▒┌┘
┘ ┘ ┘ ┘ ┘ ┘ ───┘ ───┘ ─┘
(c) П.Ю.Федин
╔═════════════════════════════════════════════════╗
║ ║
║ ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ ║
║ ║
║ TR-DOS 5.04T (5.03) ║
║ ║
║ ДЛЯ ПРОФЕССИОНАЛОВ, ║
║ ║
║ А ТАКЖЕ ДЛЯ ТЕХ, ║
║ ║
║ КТО ХОЧЕТ ИМИ СТАТЬ. ║
║ ║
╚═════════════════════════════════════════════════╝
пpодолжение
Адрес 1680. Выполнение команды COPY. Установите
23825 и 23611.
1680 LD HL,(23825);берем адрес второго символа ко-
мандной строки
INC HL
LD A,(HL) ;берем этот символ
AND 223 ;буква заглавная
CP "S" ;это "S" ?
JP Z,4960 ;если да, то копируем 1 файл на
одном дисководе
CP "B" ;это "B" ?
JP Z,5420 ;если да, то копирование всего
диска на одном дисководе
CALL 7629 ;прием имен файлов
CALL 7541 ;если идет проверка на синтак-
сис, то возврат
CALL 5743 ;выделение места в памяти
CALL 4142 ;прием расширения файла
CALL 7344 ;установка старого имени файла
LD A,(23798) ;сохранение номера дисковода -
источника
LD (23800),A
JP NZ,1483 ;если файл не найден, то провер-
ка COPY "*","*"
Ошибка!!! COPY "*","*" надо проверять всегда, иначе
при наличии на диске файла с именем "*" скопируется
только этот файл, а в целом тут должно быть так:
LD (23800),A
PUSH AF
CALL 1483
POP AF
JP NZ,985
А в подпрограмме 1483 вместо JP NZ,985 должно
быть RET NZ.
CALL 5725 ;чтение описателя файла
LD HL,23782 ;сохранение его части
LD DE,23789
LD BC,7
LDIR
CALL 7344 ;установка нового имени файла
PUSH AF ;сохранение результата проверки
PUSH BC ;и номера файла
LD A,(23798) ;сохранение номера дисковода -
приемника
LD (23801),A
LD A,(23800) ;выбор дисковода - источника
CALL 15819
CALL 1029 ;настройка на диск
LD A,(23801) ;выбор дисковода - приемника
CALL 15819
CALL 1029 ;настройка на диск
POP BC ;восстановление номера файла
POP AF ;и результата проверки нового
имени файла
JR NZ,1779 ;если файл не найден, то копиро-
вание файла
CALL 1460 ;проверка файла с расширением
"#"
JR NZ,1779 ;если копируется другой блок, то
копируем его
CALL 1409 ;запрос OVERWRITE ?
JP NZ,993 ;если был ответ N, то O.K.
1779 CALL 1596 ;копирование файла
CALL 7747 ;перезапись сектора с описателем
файла
LD A,(23781) ;берем расширение файла
CP "#" ;это "#" ?
JP NZ,993 ;если нет, то O.K.
LD A,10 ;файл искать по 10 байтам
LD (23814),A
LD HL,23782 ;следующий блок
INC (HL)
LD A,(23800) ;выбор дисковода - источника
CALL 15819
CALL 1460 ;поиск блока
JP NZ,993 ;если не нашли, то O.K.
CALL 5725 ;чтение его описателя
LD HL,23782 ;сохранение его части
LD DE,23789
LD BC,7
LDIR
LD A,(23801) ;выбор дисковода - приемника
CALL 15819
CALL 1029 ;настройка на диск
JR 1779 ;повтор
───────────────────────────────────────────────────
Адрес 1839. Копирование файла при двух дисководах.
Установите 23793, 23843, 23800, 23801, 23794, 23759
и 23787.
1839 LD A,(23793) ;берем количество секторов
OR A ;все скопировали ?
RET Z ;если да, то возврат
PUSH HL ;сохранение HL
LD HL,23843 ;адрес переменной с длиной рабо-
чей области памяти
SUB (HL) ;области хватит ?
POP HL ;восстановление HL
JR NC,1909 ;если рабочей области не хватит,
то копируем часть файла
LD A,(23793) ;копируем весь остаток
LD B,A
*OR A ;скопировали все
LD (23793),A
1860 PUSH BC ;сохранение количества копируе-
мых сектоpов
LD A,(23800) ;выбор дисковода-источника
CALL 15819
POP BC ;восстановление количества копи-
руемых секторов
PUSH BC ;и снова сохранение его
LD HL,(23759);берем адрес рабочей области па-
мяти
PUSH HL ;сохраняем его
LD DE,(23794);берем адрес части файла на дис-
ке-источнике
CALL 7741 ;загрузка секторов
LD HL,(23796);установка адреса следующей гру-
ппы секторов
LD (23794),HL;на диске-источнике
LD A,(23801) ;выбор дисковода-приемника
CALL 15819
POP HL ;восстановление адреса рабочей
области памяти
POP BC ;и количества копируемых секто-
ров
LD DE,(23787);берем адрес части файла на дис-
ке-приемнике
CALL 7757 ;запись секторов
LD HL,(23796);установка адреса следующей гру-
ппы секторов
LD (23787),HL;на диске-приемнике
JR 1839 ;повтор
1909 LD (23793),A ;установка оставшегося количест-
ва секторов
PUSH HL ;сохранение HL
LD HL,23843 ;копируем столько секторов, ско-
лько
LD B,(HL) ;поместится в рабочую область
POP HL ;восстановление HL
*OR A ;обнуление аккумулятора
JR 1860 ;копирование секторов
пpодолжение следует ...
Другие статьи номера:
Похожие статьи:
В этот день... 15 ноября