В этой статье автор ссылается на: А.П. Гармашов. О текстах подпрограмм в кодах для БЕЙСИКа БК0010 (ВТ, №8, 1990, с. 12) и В.В. Авсеев, А.В. Авсеев. Использование возможностей БЕЙСИКа в программах на языке Ассемблера.
М.В. Михулин (г. Таллин)
ПРОГРАММА DEC
В журналах «Вычислительная техника и её применение» №8, 12 '90 поднимался вопрос о подпрограммах в кодах для Бейсика БК 0010. Предлагаемая мной программа также имеет к этому отношение.
Известно, что соединить программу, написанную на Бейсике с подпрограммой в кодах можно при помощи операторов DATA и РОКЕ и потом обращаться к ней через USR. Названные операторы содержат текст подпрограммы в виде чисел, представленных в одной из трёх систем счисления: десятичной, восьмеричной или шестнадцатеричной. Программирующим в кодах на БК наиболее удобна и привычна восьмеричная система, поэтому, часто подпрограммы записываются в операторы DATA и РОКЕ именно в этой форме. Однако, учитывая малый объём ОЗУ БК, на мой взгляд, лучше записывать подпрограммы в кодах в десятичной форме. Экономия памяти получается на отсутствии знака &О.
Разумеется, если имеется уже записанная на МЛ подпрограмма в кодах, то можно воспользоваться для её упаковки в операторы DATA программами из журналов «В.Т.» №8, 12.90. Однако, если подпрограмма находится в листинге, то её перевод из восьмеричной системы в десятичную затруднителен из-за отсутствия в Бейсик 24.07.86 команды перевода.
Моя программа предназначена для автоматического перевода чисел из восьмеричной формы в десятичную и записи их в операторы DATA.
Программа написана в машинных кодах и занимает адреса &O1000 - &О1204. Загружается в память с МЛ командой BLOAD «DEC»,R. Обязательно R! Признаком начала работы программы является погасание курсора, восстановить который можно клавишей СТОП. После этого приступаем к набору программы на Бейсике и операторов DATA. Набор строк Бейсик-программы производится обычным способом. Строка с оператором DATA набирается следующим образом: номер строки и DATA, как обычно, а перед вводом чисел нужно нажать АР2+любая клавиша. После этого числа набираются в той же самой восьмеричной форме, но без знака &О!!! Друг от друга числа отделяются запятыми, как и положено по формату оператора.
После набора всех чисел оператора нажимаем, как обычно, клавишу ВВОД. Программа автоматически переведёт числа в десятичную форму, запишет их в память и произведёт выход в Бейсик для набора других строк программы.
На экране ничего не изменится. Числа будут изображены так, как они были введены с клавиатуры, но после выполнения команды просмотра LIST все числа в операторах DATA будут изображаться в десятичной форме.
Признаком работы программы будет переход курсора после выполнения команды ВВОД не на следующую строку, а через одну. При просмотре программы промежутков между строк не будет. Набор следующего оператора выполняется в приведённой выше последовательности.
Как видно из описания программа использует вектор &O274, заменяя находящийся в нём адрес на свой собственный. В силу этого, при наборе Бейсик-программ нельзя задействовать программируемые ключи и элементы псевдографики, обработка которых ведётся по вектору &O274. Вернуться к исходному состоянию Бейсика можно: при работающей программе клавишей КТ или последовательностью АР2, далее любая клавиша, КТ.
Преимущество хранения подпрограммы в кодах в десятичной форме очевидно. Например, программа COM.ASC из журнала «В.Т.» №3.89 после замены на десятичную форму, стала занимать память на 200 байт меньше. Результат команды FRE() после компиляции программы редактора спрайтов из «В.Т.» №1.91 стал 868 вместо 158. Сокращается время набора с клавиатуры.
Как отмечалось, программа может работать с операторами DATA и РОКЕ, а также с LET, DEF USR, частично с OUT.
При работе с программой требуется внимательность и аккуратность, так как программа не допускает редактирования. При наборе неверного числа или цифры нужно выйти из программы через клавишу ВВОД и набрать строку заново.
Программа «DEC» использует подпрограммы Бейсика, а именно: запись данных в память совместно с редактором Бейсика с адреса &О134012, перевод чисел из восьмеричной формы в десятичную с адреса &О140536, восстановление стека &O121626 (входит в редактор Бейсика &О121052). Ввод восьмеричных чисел с клавиатуры аналогичен подпрограмме монитора &O100472, но в несколько изменённом виде.
Для хранения набранных с клавиатуры восьмеричных чисел программа использует буфер с адреса &О400.
Программа «DEC»
Адрес |
Код |
Ассемблер |
Комментарии |
---|---|---|---|
1000 |
12737 |
MOV #1012,@#274 |
Запись в ячейку 2748 адреса начала программы |
1002 |
1012 |
|
|
1004 |
274 |
|
|
1006 |
4737 |
JSR R7,@#134012 |
Обращение к подпрограмме Бейсика |
1010 |
134012 |
|
|
1012 |
10146 |
MOV R1,-(R6) |
Запись в стек последней занятой ячейки буфера ввода Бейсика |
1014 |
12702 |
MOV #400,R2 |
Начальный адрес буфера программы |
1016 |
400 |
|
|
1020 |
5005 |
CLR R5 |
Ввод восьмеричных чисел оператора DATA с клавиатуры |
1022 |
104006 |
EMT 6 |
|
1024 |
104016 |
EMT 16 |
|
1026 |
120027 |
CMPB R0,#54 |
Если (,), то число заносится в буфер с адреса 400 |
1030 |
54 |
|
|
1032 |
1416 |
BEQ 1070 |
|
1034 |
120027 |
CMPB R0,#3 |
Возвращение к исходному состоянию Бейсика через клавишу <КТ> |
1036 |
3 |
|
|
1040 |
1454 |
BEQ 1172 |
|
1042 |
120027 |
CMPB R0,#12 |
Переход к обработке восьмеричных чисел и занесению полученных десятичных в память |
1044 |
12 |
|
|
1046 |
1412 |
BEQ 1074 |
|
1050 |
162700 |
SUB #60,R0 |
|
1052 |
60 |
|
|
1054 |
100761 |
BMI 1020 |
|
1056 |
6305 |
ASL R5 |
|
1060 |
6305 |
ASL R5 |
|
1062 |
6305 |
ASL R5 |
|
1064 |
60005 |
ADD R0,R5 |
|
1066 |
755 |
BR 1022 |
|
1070 |
10522 |
MOV R5,(R2)+ |
Занесение числа в буфер программы и переход к набору следующего |
1072 |
752 |
BR 1020 |
|
1074 |
10522 |
MOV R5,(R2)+ |
Запись в буфер последнего числа |
1076 |
10200 |
MOV R2,R0 |
Запоминание последней занятой ячейки буфера программы |
1100 |
12702 |
MOV #400,R2 |
Адрес буфера программы |
1102 |
400 |
|
|
1104 |
12205 |
MOV (R2)+,R5 |
Извлечение восьмеричного числа из буфера для обработки |
1106 |
10246 |
MOV R2,-(R6) |
Запоминание следующей ячейки буфера |
1110 |
4737 |
JSR R7,@#140536 |
Обращение к подпрограмме перевода восьмеричных чисел в десятичные |
1112 |
140536 |
|
|
1114 |
12602 |
MOV (R6)+,R2 |
Восстановление ячейки буфера программы |
1116 |
12603 |
MOV (R6)+,R3 |
Восстановление последней ячейки буфера ввода Бейсика |
1120 |
5305 |
DEC R5 |
|
1122 |
121127 |
CMPB @R1,#40 |
Извлечение преобразованного числа из области преобразования с адреса 3022 и запись его в буфер ввода Бейсика |
1124 |
40 |
|
|
1126 |
1401 |
BEQ 1132 |
|
1130 |
111123 |
MOVB @R1,(R3)+ |
|
1132 |
5201 |
INC R1 |
|
1134 |
20105 |
CMP R1,R5 |
|
1136 |
1371 |
BNE 1122 |
|
1140 |
20002 |
CMP R0,R2 |
Проверка окончания буфера программы |
1142 |
1404 |
BEQ 1154 |
|
1144 |
112723 |
MOVB #54,(R3)+ |
Разделительная (,) между числами |
1146 |
54 |
|
|
1150 |
10346 |
MOV R3,-(R6) |
Запоминание ячейки буфера ввода Бейсика и переход к обработке следующего числа |
1152 |
754 |
BR 1104 |
|
1154 |
12700 |
MOV #12,R0 |
Подготовка к выводу из программы и переходу к редактору Бейсика |
1156 |
12 |
|
|
1160 |
10301 |
MOV R3,R1 |
|
1162 |
62706 |
ADD #16,R6 |
Возврат стека |
1164 |
16 |
|
|
1166 |
4737 |
JSR R7,@#121626 |
Переход к редактору Бейсика |
1170 |
121626 |
|
|
1172 |
12737 |
MOV #101362,@#274 |
Полный выход из программы и возвращение вектору 274 стандартного адреса 1013628 |
1174 |
101362 |
|
|
1176 |
274 |
|
|
1200 |
62706 |
ADD #36,R6 |
Возврат стека |
1202 |
36 |
|
|
1204 |
700 |
BR 1006 |
Переход к редактору Бейсика |