И.П.Березенцев, программист (г.Пермь)
Ещё раз о "Больших программах на БК 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