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

---------------------------------------------------
ЛИКБЕЗ
---------------------------------------------------
(c) П.Ю.Федин
╔═════════════════════════════════════════════════╗
║ ║
║ ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ ║
║ ║
║ TR-DOS 5.04T (5.03) ║
║ ║
║ ДЛЯ ПРОФЕССИОНАЛОВ, ║
║ ║
║ А ТАКЖЕ ДЛЯ ТЕХ, ║
║ ║
║ КТО ХОЧЕТ ИМИ СТАТЬ. ║
║ ║
╚═════════════════════════════════════════════════╝
пpодолжение
Адрес 688. Перенос трех байтов из адреса HL по
адресу DE.
688 LD B,3 ;количество байтов
690 LD A,(HL);перенос байта
LD (DE),A
INC HL ;адреса следующих байтов
INC DE
DJNZ 690 ;повтор до конца
RET ;возврат
───────────────────────────────────────────────────
Адрес 697. Остановка дисковода. В A поместите зна-
чение системного регистра.
697 LD B,32 ;32 повтора
699 PUSH BC ;сохранение количества повторов
XOR 8 ;переключение бита 3
OUT (255),A;загрузка системного регистра
PUSH AF ;сохранение значения системного
регистра
LD A,5 ;задержка в 17962 такта
CALL 15871
POP AF ;восстановление значения системно-
го регистра
POP BC ;и количества повторов
DJNZ 699 ;повтор до конца
RET ;возврат
───────────────────────────────────────────────────
Адрес 715. Командный процессор. Используется также
с адресов:
751 - исполнение команды. Сжатую команду поместите
в буфер командной строки;
778 - исполнение команды. Установите все для 467,
23825 и загрузите из 23825 HL.
715 LD HL,(23836);очистка стека
DEC HL
DEC HL
LD SP,HL
CALL 8433 ;изменение памяти
CALL 7555 ;открытие потока 0
LD A,(23830) ;выбор дисковода D:
OR 3
CALL 697 ;остановка его
LD A,(23830) ;остановка текущего дисковода
CALL 697
XOR A ;сообщения об ошибках печатать
LD (23829),A
CALL 8501 ;принятие команды
CALL 12338 ;сжатие командной строки
751 CALL 7583 ;очистка низа экрана
LD HL,715 ;возвращаться в командный про-
цессор
LD (23834),HL
XOR A ;ошибок не было
LD (23823),A
LD HL,(23641);берем адрес командной строки
PUSH HL ;сохраняем его
LD DE,23840 ;адрес буфера
CALL 688 ;сохранение трех первых символов
строки
POP HL ;восстановление адреса строки
LD (23825),HL;установка адреса командной
строки
778 LD A,(HL) ;берем первый символ строки
LD B,A ;сохраняем его
AND 128 ;его код меньше 128 ?
LD A,B ;восстановление символа
JR Z,794 ;если его код меньше 128, то ди-
сковод не устанавливать
CP 254 ;это RETURN ?
JR Z,794 ;если да, то дисковод не устана-
вливать
PUSH AF ;сохранение символа
CALL 15816 ;активизация дисковода по умол-
чанию
POP AF ;восстановление символа
794 LD HL,12275 ;адрес таблицы команд
DEC HL
LD C,0 ;проверка первой команды
800 INC C
LD D,A ;сохранение символа
LD A,21 ;пройдена вся таблица ?
CP C
JP C,467 ;если да, то завершение
Лучше было бы поставить здесь JP C,7450 для выдачи
сообщения "*ERROR*".
LD A,D ;восстановление символа
INC HL ;адрес следующей команды в таб-
лице
CP (HL) ;символы совпали ?
JR NZ,800 ;если нет, то повтор
CP 254 ;введена команда RETURN ?
CALL NZ,10570;если нет, то создание буфера
LD A,9 ;поиск файла вести по 9 байтам
LD (23814),A
XOR A ;ошибок не было
LD (23823),A
LD (23766),A ;расширение файла принимать
LD (23824),A ;на случай загрузки или верифи-
кации файла
LD HL,23611 ;проверка строки на синтаксис
RES 7,(HL)
LD B,0 ;перевод номера команды в двух-
байтную форму
LD HL,12296 ;адрес таблицы адресов подпрог-
рамм
DEC C ;команды считать с нуля
SLA C ;умножение номера подпрограммы
на 2
ADD HL,BC ;определение адреса в таблице
LD E,(HL) ;берем адрес подпрограммы
INC HL
LD D,(HL)
EX DE,HL ;переносим его в HL
PUSH HL ;сохраняем его
LD DE,857 ;возврат будет в 857
PUSH DE
JP (HL) ;вызов подпрограммы
857 LD HL,23611 ;выполнение команды
SET 7,(HL)
POP HL ;восстановление адреса подпрог-
раммы
JP (HL) ;вызов подпрограммы
пpодолжение следует ...
Другие статьи номера:
Похожие статьи:
В этот день... 17 ноября