В этой статье автор ссылается на: А.П. Гармашов. О текстах подпрограмм в кодах для БЕЙСИКа БК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

Переход к редактору Бейсика

 

Performed by © gid, 2012-2022.