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