Адрес 298. Обработка номера строки автостарта программы на бей-
сике. Установите 23824 и загрузите программу.
298 CALL 8421 ;изменение памяти и удаление буфера
CALL 7575 ;очистка экрана
Ох, как меня это бесит, если одна программа на бейсике грузит
заставку, а затем другую программу на бейсике.
LD HL,(23641);берем адрес, по которому находится номер
INC HL ;строки автозапуска программы
LD E,(HL) ;берем этот номер
INC HL
LD D,(HL)
LD A,D ;это 0 ?
OR E
EX DE,HL ;переброска его в HL
JR Z,320 ;если это не 0, то программу запускать
XOR A
LD (23824),A
320 PUSH HL ;сохранение номера строки автостарта
CALL 562 ;восстановление старого адреса подпрограммы обработки ошибок
POP HL ;восстановление номера строки автостарта
LD (23618),HL;установка его
XOR A ;строку запускать с первого оператора
LD (23620),A
RST 32 ;очистка рабочей области памяти, стека калькулятора и
;буфера редактора
DEFW #16B0
LD HL,(23635);выполнение RESTORE
DEC HL
LD (23639),HL
LD SP,(23613);очистка стека
LD A,(23824) ;программу запускать ?
OR A
LD HL,7030 ;адрес подпрограммы выполнения программы на бейсике
JR Z,358 ;если можно, то запуск программы
RST 32 ;сообщение O.K.
DEFW #1BB0
358 PUSH HL ;помещение на стек адреса подпрограммы выполнения программы
на бейсике
LD HL,23746 ;помещение на стек адреса переключателя ПЗУ на бейсик
PUSH HL
RET ;переход к подпрограмме выполнения программы на бейсике
----------------------------------------------------------------
Адрес 364. То же, что и 15642, но не создает системные перемен-
ные.
364 CALL 8433 ;изменение памяти
CALL 10570 ;создание буфера
LD A,255 ;сообщения не печатать
LD (23829),A
XOR A ;обнуление 23799
LD (23799),A
LD A,170 ;заставку не выводить
LD (23831),A
LD HL,513 ;возвращаться в бейсик
LD (23834),HL
LD HL,0 ;сохранение SP
ADD HL,SP
LD (23836),HL
DEC HL ;выделение места для адреса подпрограммы
DEC HL ;обработки ошибок
LD SP,HL
CALL 541 ;установка адреса подпрограммы обработки ошибок
LD HL,(23730);командная строка находится выше RAMTOP ?
LD DE,(23645)
SBC HL,DE
EX DE,HL
JR NC,421 ;если да, то при выделении буфеpа она не
OR A ;перемещалась
LD DE,257
SBC HL,DE
421 LD (23645),HL
424 CALL 455 ;следующий символ строки ENTER ?
427 JP Z,467 ;если да, то завершение
CP 234 ;это REM ?
INC HL ;следующий символ
JR NZ,424 ;если нет, то следующий символ
CALL 455 ;следующий символ строки ENTER ?
JR Z,427 ;если да, то завершение
CP ":" ;это двоеточие ?
JP NZ,467 ;если нет, то возврат
INC HL ;следующий символ
CALL 12360 ;сжатие строки
JP 778 ;выполнение команды
----------------------------------------------------------------
Адрес 455. берет символ по адресу из HL и возвращает его в акку-
муляторе плюс флаг Z если это 0, 13 или 128, иначе NZ.
455 LD A,(HL);берем байт по нужному адресу
CP 13 ;это 13 ?
RET Z ;если да, то возврат
CP 128 ;это 128 ?
RET Z ;если да, то возврат
OR A ;сравнение его с нулем
RET ;возврат
----------------------------------------------------------------
Адрес 467. Подпрограмма завершения. Вход: установить 23734,
23820, 23823, 23825, 23832, 23834, 23836 и 23839. Выход: в SP
адрес из 23836, а в BC код ошибки.
467 LD HL,0 ;буфер убирать, память изменять
LD (23800),HL
CALL 8421 ;если есть буфер, то уберем его
CALL 7523 ;если надо, то очистка рабочей области памяти
LD HL,23831 ;заставку не выводить
LD (HL),170
LD HL,23839 ;команда поступила из машинного кода ?
LD A,(HL)
OR A
LD (HL),0 ;следующая команда будет не из маш. кода
JR NZ,499 ;если команда была не из машинного кода, то
CALL 7708 ;удаление из строки 5-байтовых чисел
CALL 530 ;и прогон символов до конца строки
499 LD SP,(23836);помещаем в SP адрес из 23836
LD HL,(23834);берем адрес выхода из этой подпрограммы
LD BC,(23823);помещаем в BC код ошибки
LD B,0
JP (HL) ;переход по назначенному адресу
----------------------------------------------------------------
Адрес 513. Проверка на ошибку. Вход: установите 23610 и 23827.
513 CALL 562 ;помещение в 23613 адреса из 23827
BIT 7,(IY+0) ;была ошибка ?
RET NZ ;если нет,то возврат
LD DE,23746 ;адрес команды RET в озу
LD SP,(23613);установка SP на дно стека
PUSH DE ;переход на обработку ошибок
RET
----------------------------------------------------------------
Адрес 530. Прогон символов до конца строки. Установите в 23645
адрес одного из символов строки. На выходе там будет адрес конца
строки.
530 CALL 7564;берем текущий символ строки
CP 13 ;это ENTER ?
RET Z ;если да, то возврат
CALL 7722;берем следующий символ строки
JR 530 ;повтор
----------------------------------------------------------------
Адрес 541. Установка адреса обработки ошибок. Вход: в 23836 дол-
жен быть адрес на 2 больше того, по которому размещаете адрес
подпрограммы обработки ошибок. Выход: старое содержимое 23613
копируется в 23827, а в 23613 помещается адрес, по которому на-
ходится размещенный адрес.
541 LD HL,(23613);сохранение старого содержимого 23613
LD (23827),HL
LD HL,(23836);берем адрес из 23826
DEC HL ;берем нужный нам адрес
DEC HL
LD (23613),HL;установка 23613
LD DE,15638 ;адрес подпрограммы обработки ошибок
LD (HL),E ;запись его в наши ячейки
INC HL
LD (HL),D
RET ;возврат
----------------------------------------------------------------
Адрес 562. Помещение в 23613 адреса из 23827. Установите 23827.
562 LD HL,(23827)
LD (23613),HL
RET
----------------------------------------------------------------
Адрес 569. Вход в командный процессор. Используется также с ад-
реса 635 (запуск файла "boot").
569 LD HL,0 ;обнуление 23799 и 23800
LD (23799),HL
ADD HL,SP ;сохранение SP
LD (23836),HL
DEC HL ;выделение места для адреса подпрограммы
DEC HL ;обработки ошибок
LD SP,HL
CALL 541 ;установка адреса подпрограммы обработки ошибок
LD HL,23831 ;заставку выводить ?
LD A,(HL)
CP 170
LD A,0 ;ошибок нет
LD (23823),A
JP Z,715 ;если заставка не нужна, то переход к командному процессору
LD (HL),170 ;в следующий раз заставку не выводить
CALL 7575 ;очистка экрана
CALL 7560 ;открытие потока 2
LD HL,864 ;вывод текста заставки
RST 24
CALL 4206 ;вывод цветных полос
LD A,(23734) ;интерфейс-1 есть ?
CP 244
JR Z,625 ;если да, то
LD HL,4096 ;вывод "Interface one fitted."
RST 24
625 LD A,(23296) ;файл "boot" запускать ?
CP 170
JR NZ,715 ;если нет, то вход в командный процессор
CALL 8433 ;изменение памяти
LD HL,(23641);берем адрес буфера команд
LD A,254 ;был запущен файл "boot"
LD (23822),A
LD (HL),247 ;ввод команды RUN"boot"
INC HL
LD (HL),34
INC HL
LD (HL),"b"
INC HL
LD (HL),"o"
INC HL
LD (HL),"o"
INC HL
LD (HL),"t"
INC HL
LD (HL),34
INC HL
LD (23643),HL;установка адреса курсора
LD (HL),13 ;ENTER
INC HL
LD (HL),128 ;конец области
INC HL
LD (23649),HL;установка переменной WORKSP
LD (23651),HL;установка и очистка стека калькулятора
LD (23653),HL
SET 3,(IY+1) ;установка режима L
JR 751 ;выполнение команды
----------------------------------------------------------------
Адрес 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) ;вызов подпрограммы
----------------------------------------------------------------
Адрес 864. Текст заставки TR-DOS.
864 DEFB 22,1,15
DEFM "* TR-DOS Ver 5.04T*"
DEFB 13,13,127
DEFM " 1986 Technology Research ltd."
DEFB 22,5,11
DEFM "(U.K.)"
DEFB 22,7,5
DEFM "BETA 128"
DEFB 0
----------------------------------------------------------------
Адрес 940. Завершение выдачи каталога.
940 CALL 1021 ;загрузка в буфер сектора 8 дорожки 0
CALL 15744 ;перевод строки
CALL 15744 ;еще раз
LD BC,(24074);берем количество свободных секторов на диске
CALL 7593 ;печать его
LD HL,10706 ;печать FREE
RST 24
JP 467 ;завершение
----------------------------------------------------------------
Адрес 960. Переход к подпрограмме завершения.
960 JP 467
----------------------------------------------------------------
Адрес 963. Печать сообщения об ошибке. В HL установите адрес со-
общения, в A - код ошибки.
963 PUSH AF ;сохранение кода ошибки
LD A,(23822);ошибка произошла при автозагрузке ?
CP 254
JR NZ,973 ;если нет, то установка кода ошибки
POP AF ;снятие со стека кода ошибки
RET ;возврат
973 POP AF ;восстановление кода ошибки
LD (23823),A;установка кода ошибки
LD A,(23829);печать сообщений разрешена ?
OR A
CALL Z,9991 ;если да, то печать сообщения
Ошибка!!! Перед печатью надо открыть поток 0 и очистить низ эк-
рана.
RET ;возврат
----------------------------------------------------------------
Адрес 993. Вывод сообщения O.K.
993 LD HL,10086;адрес сообщения O.K.
XOR A ;код ошибки - 0
JP 7242 ;выдача сообщения и завершение
----------------------------------------------------------------
Адрес 1000. Загрузка сектора 0 дорожки 0 в буфер. Обнуляет
23756. Используется также с адресов:
1004 - загрузка сектора дорожки 0 в буфер. Установите 23756.
1010 - загрузка сектора в буфер, номер сектора в E, дорожки - в
D).
1000 XOR A ;текущий сектор 0
LD (23756),A
1004 LD DE,(23756);берем номер сектора
LD D,0 ;дорожка 0
1010 CALL 10570 ;создание буфера
LD HL,23845 ;загружать в буфер
LD B,1 ;1 сектор
JP 7741 ;загрузка сектора
----------------------------------------------------------------
Адрес 1021. Загрузка в буфер сектора 8 дорожки 0. Установите
23820.
1021 CALL 10570;создание буфера, если его нет
LD DE,8 ;дорожка 0, сектор 8
JR 1010 ;загрузка сектора в буфер
----------------------------------------------------------------
Адрес 1029. Настройка на диск. Меняет переменную с типом диско-
вода.
1029 CALL 1021 ;чтение в буфер сектора 8 дорожки 0
LD A,(24076);диск от TR-DOS ?
CP 16
JR Z,1045 ;если да, то установка типа дисковода
LD HL,10722 ;адрес сообщения DISC ERROR
RST 24 ;печать сообщения
JR 960 ;завершение
Внимание, ошибка!!! Неправильно обрабатывается ошибка. Здесь
программа должна быть такой:
LD HL,10722
LD A,7
JP 7242
А в этом случае ваша программа не получит код ошибки, а внизу
экрана совершенно не к месту появится DISC ERROR.
CALL 15889 ;берем тип дисковода
RES 0,(HL) ;установка типа дисковода под тип диска
RES 1,(HL) ;и возврат
LD A,(24072)
BIT 0,A
JR NZ,1061
SET 0,(HL)
1061 BIT 3,A
RET NZ
SET 1,(HL)
RET
Ошибка!!! Перед установкой типа надо бы проверить совместимость
диска и дисковода.
----------------------------------------------------------------
Адрес 1067. Проверка второго символа командной строки. Вход: ус-
тановите 23825. На выходе будет установлен флаг Z, если это EN-
TER и сброшен, если нет.
1067 LD HL,(23825);берем адрес начала строки команды
INC HL ;берем адрес ее второго символа
LD A,(HL) ;берем этот символ
CP 13 ;сравнение его с ENTER
RET ;возврат
----------------------------------------------------------------
Адрес 1075. Выполнение команды CAT. Установите 23825 и 23611.
Используется также с адреса 1145 (вывод каталога диска; в A -
номер потока, в буфере - сектор 8 дорожки 0).
1075 CALL 1067 ;второй символ строки команды ENTER ?
LD BC,2 ;каталог выводить в поток 2
LD (23771),BC
JR Z,1130 ;если второй символ строки ENTER, то вывод каталога
CP "#" ;второй символ строки "#" ?
JR NZ,1117 ;если нет, то установка дисковода и вывод каталога
LD (23645),HL;установка CH_ADD на второй символ строки
CALL 7691 ;установка номера потока
CALL 7564 ;берем текущий символ
CP 13 ;это ENTER ?
JR Z,1130 ;если да, то вывод каталога
CP "," ;это запятая ?
JP NZ,7450 ;если нет, то синтаксическая ошибка
CALL 7722 ;берем следующий символ
CALL 7613 ;помещение имени дисковода на стек калькулятора
JR 1120 ;установка дисковода и вывод каталога
1117 CALL 7647 ;установка CH_ADD и помещение имени дисковода на
;стек калькулятора
1120 CALL 7541 ;если строка проверяется на синтаксис, то возврат
CALL 7605 ;снятие имени дисковода со стека калькулятора
EX DE,HL
CALL 7297 ;установка дисковода
1130 CALL 7541 ;если проверка на синтаксис, то возврат
LD A,(23798) ;помещение номера дисковода в 23801
LD (23801),A
CALL 1029 ;настройка на диск
LD A,(23771) ;берем номер потока
1145 CP 2 ;выводим в поток 2 ?
PUSH AF ;сохранение номера потока
CALL Z,7575 ;если назначен поток 2, то очистка экрана
POP AF ;восстановление номера потока
CP 17 ;он больше 16 ?
Ошибка!!! Всего потоков 15, а не 16.
JP NC,7450 ;если да, то ошибка
CALL 7556 ;открытие потока
Ошибка!!! Надо бы проверить, подключен ли куда-нибудь этот по-
ток.
LD A,255 ;установка 23800 в 255
LD (23800),A
LD HL,10743 ;печать TITLE:
RST 24
LD HL,24090 ;печать имени диска
RST 24
CALL 15744 ;перевод строки
LD A,(24073) ;вычисление количества нестертых файлов на диске
LD HL,24089
SUB (HL)
PUSH HL
CALL 7587 ;печать его
LD HL,10795 ;печать FILES
RST 24
POP HL
LD C,(HL) ;берем количество стертых файлов
CALL 7588 ;печать его
LD HL,10781 ;печать DEL.FILES
RST 24
CALL 1000 ;загрузка в буфер сектора 0 дорожки 0
LD HL,23845 ;берем начало буфера
1206 CALL 1270 ;проверка достижения конца каталога
CALL 15744 ;перевод строки
LD A,(23798) ;печать имени дисковода
ADD A,"A"
RST 16
LD B,2 ;печатаем по 2 имени в строке
1220 CALL 1270 ;если файл стерт, то пропуск его
PUSH BC ;сохранение количества имен файлов в строке
LD A,":" ;печать двоеточия
RST 16
PUSH HL ;сохранение адреса текущего описателя файла в буфере
CALL 10552 ;печать имени и расширения файла
LD BC,13 ;вычисление адреса, по которому находится
POP HL ;размер файла в секторах
PUSH HL
ADD HL,BC
LD C,(HL) ;берем размер файла
PUSH BC ;сохраним его
LD A,C ;перегрузим его в A
LD B,2 ;вычисление количества пробелов перед числом
CP 10
JR C,1247
DEC B
CP 100
JR NC,1256
1251 LD A," " ;печать пробелов
RST 16
DJNZ 1251
1256 POP BC ;восстановление размера файла
CALL 7593 ;печать его
POP HL ;восстановление адреса текущего описателя файла
POP BC ;восстановление количества имен файлов в строке
LD DE,16 ;следующий описатель
ADD HL,DE
DJNZ 1220 ;если напечатали только 1 файл, то печать второго
JR 1206 ;следующая строка
----------------------------------------------------------------
Адрес 1270. Проверка переменной 23801 и проверка достижения кон-
ца каталога при его печати.
1270 PUSH HL ;сохранение HL и BC
PUSH BC
LD A,(23801) ;берем номер дисковода для выдачи каталога
LD HL,23798 ;назначен этот дисковод ?
CP (HL)
CALL NZ,15755;если нет, то о последствиях читайте в конце
Ошибка в программе!!! Об этом особо в конце текста.
POP BC ;восстановление HL и BC
POP HL
JP 12230 ;проверка достижения конца каталога и возврат
Обратите особое внимание на команду CALL NZ,15755. В аналогичной
подпpогpамме для LIST стоит CALL NZ,15819. В нашем же случае уп-
pавление будет передано в подпрограмму печати символа (ее адрес
15744) на адрес, где находятся 2 байта адреса от команды
CALL 15764. Программа с этого адреса будет такой:
SUB H
DEC A
CALL 8433
POP DE
POP BC
POP HL
RET
Таким образом произойдет изменение памяти, если оно разрешено,
затем со стека будут сняты 3 адреса и помещены в регистры и за-
тем произойдет возврат. Последствия всего этого определяются
программой, вызвавшей 1270.
----------------------------------------------------------------
Адрес 1287. Прибавление 16 к HL.
1287 LD DE,16
ADD HL,DE
RET
----------------------------------------------------------------
Адрес 1292. Проверка и обработка достижения конца буфера при ра-
боте с каталогом. Установите 23756 и поместите в HL текущее мес-
то буфера. Если достигнут его конец, то в HL будет начало буфера
и в него будет загружен следующий сектор каталога.
1292 PUSH HL ;сохранение HL и BC
PUSH BC
LD BC,41435;достигнут конец буфера ?
ADD HL,BC
JR C,1303 ;если да, то загрузка следующего сектора
POP BC ;восстановление HL и BC
POP HL
RET ;возврат
1303 LD HL,23756;следующий сектор
INC (HL)
CALL 1004 ;загрузка его в буфер
POP BC ;восстановление BC и HL
POP HL
LD HL,23845;помещение в HL адреса начала буфера
RET ;возврат