И.П.Березенцев, программист (г.Пермь)
Ещё раз о "Больших программах на БК 0010"
Думаю, что программа СОМ, приведённая в статье Сарычихина и Фролова "Большие программы для БК 0010" (ВТ № 3,1989) и доработанная Жариковым (ВТ № 2,1990), больше всего должна заинтересовать преподавателей, работающих с КУВТ-86, так как наиболее полно достоинства программы проявляются при работе с дисководом. Доработанная для работы с дисководом программа названа мной COM1.
- Двоеточие используется при обращении к дисководу, поэтому в программе COM1 маркер окончания программы устанавливается клавишей "КТ" - конец текста.
- Неудобен метод переключения адреса прерываний по EMT, предложенный Жариковым. Он требует доработки каждой Бейсик-программы, причём доработанные программы автономно уже не работают. Поэтому контроль за прерываниями я поручил программе COM1. Вызываемые программы доработки не требуют.
- Мало пользы от программы, которую каждый раз надо вводить заново, поэтому в доработанной программе предусмотрена возможность повторного запуска набранной программы и записи её на магнитный носитель.
После доработки программа стала короче. Работа программы подробно описана в статье Жарикова (ВТ № 2,1990). Остановлюсь на доработках.
Набранная программа может быть многократно запущена с адреса &O37422 (все адреса в статье восьмеричные). По этому адресу находится обращение к подпрограмме, в которой указатель очередного байта устанавливается на начало программы. Изменяется адрес прерывания по EMT. После этого управление передаётся БЕЙСИКу.
При прерывании по EMT управление передаётся на адрес &O37446, где проверяется наличие в стеке числа &O134016. Это адрес возврата из подпрограммы, в которой БЕЙСИК принимает очередную команду с клавиатуры в непосредственном режиме. Если такого кода в стеке нет, то прерывание EMT обрабатывается стандартным образом, иначе определяется номер EMT. Если EMT 6, то в R0 записывается очередной байт программы. Если он не равен 3 (коду клавиши "КТ"), то происходит возврат из прерывания, иначе восстанавливается вектор прерывания по EMT и управление передаётся БЕЙСИКу.
Программу COM1 лучше набирать в БЕЙСИКе. Команда в строке 90 заменяет команду DELETE. Она не влияет на работу программы, но после выхода из программы память компьютера окажется чистой. Возможна и обратная операция. Восстановив первоначальное значение ячейки &O2024 (если, конечно, оно известно), можно восстановить программу, уничтоженную командой NEW или DELETE. В ячейке &O2024 хранится адрес конца списка строк, он равен 15854-6*n, где n - число строк в программе.
Бейсик-программа COM1.ASC после запуска создаст программу в кодах, начинающуюся с адреса &037400, передаст ей управление и самоуничтожится.
Оператор должен набрать свою программу и нажать "КТ". Начнёт выполняться набранная программа. После того как работа по программе закончилась, её можно записать на магнитный носитель командой ВSА"[ТТ:]ИМЯ", &O37422, &O40000. Точный адрес конца программы можно посмотреть в ячейке &O37540.
Записанная программа может работать самостоятельно. Её загружают из БЕЙСИКа с самозапуском. Загруженную программу можно запускать многократно из монитора или командой USR с адреса &O37422.
Автором разработана аналогичная программа, которая последовательно загружает и запускает Бейсик-программы по заранее составленному списку. После окончания работы с каждой Бейсик-программой или нажатия клавиши "СТОП" делается запрос: "повторить?". При утвердительном ответе вновь запускается хранящаяся в памяти программа, при отрицательном - загружается следующая.
Такие программы удобно использовать преподавателям в классе, оборудованном КУВТ-86. Преподаватель заранее составляет программу- план на урок. Ученику надо лишь запросить эту программу.
Ещё одно её преимущество - ученик не может посмотреть листинг контролирующей программы и повлиять на выставленную компьютером оценку.
Текст программы COM1.ASC
10 DATA &O12701,&O37542,&O104006,&O104016,&O110021,&O22700,3,&O1372,&O403,&O4767,2,&O441,
&O12767,&O37542,&O102,&O12737,&O37446,&O30,&O207,&O22766,&O134016,&O20,&O1402,
&O137,&O100112,&O11667
20 DATA &O50,&O162767,2,&O42,&O22777,&O104006,&O34,&O1365,&O117700,&O30,&O5267,&O24,
&O22700,3,&O1401,2,&O12737,&O100112,&O30,&O137,&O120234,0
30 I% = &O37400
40 DEF USR = I%
50 READ A%
60 POKE I%,A%
70 I% = I%+2%
80 IF A% THEN 50
90 POKE &O2024,PEEK(&O2026)
100 А = USR(A)
Программа COM1.
Адрес Код Ассемблер
37400 012701 MOV #UK+2,R1 ;ЗАПИСАТЬ В R1 АДРЕС НАЧАЛА
37402 037542 ;ПРОГРАММЫ
37404 104006 M1: EMT 6 ;ВВОД СИМВОЛА С КЛАВИАТУРЫ
37406 104016 EMT 16 ;ПЕЧАТЬ СИМВОЛА
37410 110021 MOVB R0,(R1)+ ;ЗАПИСАТЬ СИМВОЛ В ТЕКСТ ПРОГРАММЫ
37412 022700 CMP #3,R0 ;БЫЛА НАЖАТА КЛАВИША "КТ"?
37414 000003
37416 001372 BNE M1 ;ЕСЛИ НЕТ, ТО ПРОДОЛЖИТЬ ВВОД
37420 000403 BR M2 ;ИНАЧЕ ИНИЦИАЛИЗИРОВАТЬ ПРОГРАММУ
37422 004767 ZAG: JSR PC,M2 ;ИНИЦИАЛИЗАЦИЯ ПРОГРАММЫ
37424 000002
37426 000441 BR EX ;ВЫХОД В БЕЙСИК
37430 012767 M2: MOV #UK+2,UK ;ПЕРЕСЛАТЬ В УКАЗАТЕЛЬ АДРЕС
37432 037542 ;НАЧАЛА ПРОГРАММЫ
37434 000102
37436 012737 MOV #EMT,@#30 ;ИЗМЕНИТЬ АДРЕС ПРЕРЫВАНИЯ
37440 037446 ;ПО EMT
37442 000030
37444 000207 RTS PC ;ВОЗВРАТ ИЗ ПОДПРОГРАММЫ
37446 022766 EMT: CMP #134O16,20(SP) ;НАЧАЛО ОБРАБОТКИ EMT
37450 134016
37452 000020
37454 001402 BEQ M4 ;ЕСЛИ РАБОТА В ПРОГРАММЕ, ТО
37456 000137 M3: JMP @#100112 ;ПЕРЕХОД НА ОБРАБОТКУ EMT
37460 100112
37462 011667 M4: MOV (SP),A ;ИНАЧЕ ОПРЕДЕЛЕНИЕ НОМЕРА EMT
37464 000050
37466 162767 SUB #2,A
37470 000002
37472 000042
37474 022777 CMP #104006,@A ;ЕСЛИ НЕ EMT 4, ТО ПЕРЕХОД
37476 104006
37500 000034
37502 001365 BNE M3 ;HA СТАНДАРТНУЮ ОБРАБОТКУ EMT
37504 117700 MOVB @UK,R0 ;ИНАЧЕ ПЕРЕСЛАТЬ B R0 ОЧЕРЕДНОЙ
37506 000030 ;БАЙТ ПРОГРАММЫ
37510 005267 INC UK ;ИНКРЕМЕНТ УКАЗАТЕЛЯ
37512 000024
37514 022700 CMP #3,R0 ;ПРОВЕРКА ОЧЕРЕДНОГО БАЙТА
37516 000003
37520 001401 BEQ M5 ;ЕСЛИ ПРОГРАММА НЕ ОКОНЧЕНА,
37522 000002 RTI ;TO ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ EMT
37524 012737 M5: MOV #100112,@#30 ;ИНАЧЕ ВОССТАНОВЛЕНИЕ ВЕКТОРА
37526 100112 ;ПРЕРЫВАНИЯ ПО EMT И
37530 000030
37532 000137 EX: JMP @#120234 ;ВОЗВРАТ В БЕЙСИК
37534 120234
37536 000000 A: .#0
37540 000000 UK: .#0 ;УКАЗАТЕЛЬ ОЧЕРЕДНОГО БАЙТА
END