И.П.Березенцев, программист (г.Пермь)

Ещё раз о "Больших программах на БК 0010"

Думаю, что программа СОМ, приведённая в статье Сарычихина и Фролова "Большие программы для БК 0010" (ВТ № 3,1989) и доработанная Жариковым (ВТ № 2,1990), больше всего должна заинтересовать преподавателей, работающих с КУВТ-86, так как наиболее полно достоинства программы проявляются при работе с дисководом. Доработанная для работы с дисководом программа названа мной COM1.

  1. Двоеточие используется при обращении к дисководу, поэтому в программе COM1 маркер окончания программы устанавливается клавишей "КТ" - конец текста.
  2. Неудобен метод переключения адреса прерываний по EMT, предложенный Жариковым. Он требует доработки каждой Бейсик-программы, причём доработанные программы автономно уже не работают. Поэтому контроль за прерываниями я поручил программе COM1. Вызываемые программы доработки не требуют.
  3. Мало пользы от программы, которую каждый раз надо вводить заново, поэтому в доработанной программе предусмотрена возможность повторного запуска набранной программы и записи её на магнитный носитель.

После доработки программа стала короче. Работа программы подробно описана в статье Жарикова (ВТ № 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

Performed by © gid, 2012-2022.