Статья содержит сведения о ячейках системной области ПЭВМ БК-0010 и БК-0010.01, а также данные о некоторых полезных подпрограммах, зашитых в ПЗУ монитора БК. Эти сведения будут весьма полезны для пользователей, программирующих на Ассемблере и в машинных кодах.
А.В. ЧУМАК
Системные ячейки ПЭВМ БК-0010
Для ПЭВМ БК-0010 имеется стандартная система ввода-вывода, поддерживаемая программами, записанными в ПЗУ по адресам 100000 - 120000, организующая работу ТВ-монитора, клавиатуры, кассетного магнитофона, а также простейшую связь по локальной сети (одностороннюю передачу данных).
Так как большинство программ из-за недостатка памяти в большей или меньшей степени используют программы, зашитые в ПЗУ, то более полная информация о них выгодна, так как приводит к сокращению их объёма (особенно в системе Бейсик).
Но так как они ориентированы на определённую цель - поддержание драйверов, то их применение специфично, и можно указать лишь несколько подпрограмм, которые имеют общее применение:
102062 - Звук с возрастающей частотой. Задержки при звучании: R2 - длительность (R2 не более 3008), R3 - частота;
100472 - восьмеричный ввод. Результат ввода в R5;
100460 - печать упакованной строки. Адрес строки в R3;
100644 - печать текста «ОШИБКА»;
110346 и 110362 - сохранение/восстановление регистров R0 - R3 в стеке (регистр R4 служит для связи, вызов командой JSR R4,... , после вызова R4 не использовать);
110376 - очистка экрана;
102566 - прокрутка экрана на одну строку вниз;
105232 - очистка строки справа от курсора;
103600 - сдвижка в строке;
103700 - раздвижка в строке;
103760 - сдвижка в тексте (удаление одной строки);
104020 - раздвижка в тексте (вставка пустой строки).
Эти подпрограммы, реализующие функции управляющих кодов экрана, легко модифицируются для составления собственных программ, работающих с экраном.
Больший интерес может представлять использование программ ПЗУ по своему назначению, с расширением их функций через использование системных ячеек программ ПЗУ, расположенных по адресам 000 - 377.
Системные ячейки ПЭВМ БК-0010
Адреса и значения пишутся в восьмеричном виде, снабжены краткими комментариями.
000 - 002:
Эти два слова стандартными подпрограммами не используются, их назначение у машин типа PDP-11 неизвестно (они зарезервированы для дальнейшего использования).
Для БК-0010 эти ячейки могут использоваться для обработки ненужных прерываний, например:
А) Обнуляем ненужные вектора прерываний.
Б) Записываем в ячейках 000-002 команду JMP <на обработку ошибочных прерываний>, или проще RTI для обработки ненужных прерываний (типа TRAP или сбоя питания).
Данный способ позволяет экономить память при частой замене адресов обработки прерываний.
004 - 006:
Эти два слова занимают PC и PSW прерывания по ошибке передачи данных. Прерывание вызывается нажатием клавиши «СТОП» или ошибкой при передаче данных (ошибка возникает при попытке процессора записать слово состояния процессора по адресу 160002, так как по этим адресам располагается ПЗУ тестов), или командой процессора HALT, или же прерывание вызывают команды, нарушающие чётность PC и SP.
010 - 012:
Эти два слова занимают PC и PSW прерывания по псевдокоманде, т.е. по неправильным командам ЦП или коду, не соответствующему ни одной из команд, это:
7 - 77 |
75000 - 76777 |
210 - 237 |
106500 - 106677 |
7000 - 7777 |
107000 - 107777 |
70000 - 73777 |
170000 - 177777 |
Неправильные команды:
JMP R0 - JMP R7
JSR R0,... - JSR R7,...
Псевдокоманды можно широко использовать при эмуляции, как это было сделано в программе ПИФ (ВТ № 5, 1989).
014 - 016:
Эти два слова занимают PC и PSW прерывания по биту Т - trace. Установка этого бита позволяет отслеживать фрагменты программ. Установку этого бита лучше осуществлять так:
А) Установить вектор прерывания по биту Т на отслеживающую программу.
Б) Заслать в стек слово 20, затем адрес начала отслеживаемого фрагмента.
В) Выполнить команду RTI.
TRACE$: MOV #А$,@#14 MOV #200,@#16 MOV #ADR-BEG,-(SP) MOV #20,-(SP) RTI
Отслеживающая программа (VIEWS) должна выполнять действия по просмотру необходимых регистров или ячеек памяти:
А$: JSR PC,VIEWS CMP (SP),#ADR-END BEQ RETS RTI RETS: CMP (SP)+,(SP)+ RET
020 - 022:
Эти два слова занимают PS и PSW прерывания по команде IOT. Команда может использоваться для эмуляции.
024 - 026:
Эти два слова занимают PC и PSW прерывания по аварии питания. Рекомендуется установить на команду RTI - это повысит надёжность вашей программы (возможна ситуация, когда сигнал на линии ACLO возникнет, а достаточно значительных сбоев не произойдёт, и ваша программа останется работоспособной).
030 - 032:
Эти два слова занимают PC и PSW прерывания по команде ЕМТ. Диспетчер ЕМТ команд расположен с адреса 100112, а таблица адресов подпрограмм, вызываемых командой ЕМТ с 100004-100110. По адресу 100002 находится слово 254, т.е. команда ЕМТ 2 передаёт управление подпрограмме по адресу 254 и может использоваться пользователем. Также могут использоваться команды ЕМТ с аргументами, большими 110, для вызова различных подпрограмм. (Такое возможно из-за отсутствия контроля за аргументами ЕМТ команд в диспетчере, но надо быть осторожным, например, команда ЕМТ 0 пытается перейти по адресу 167, вызывая тем самым прерывание по нечётному адресу - вектор прерывания 4). Вот список этих команд, вызывающих подпрограммы под стеком или в области ПЗУ:
ЕМТ 130 и 150 - 100000 (Переинициализация системы);
ЕМТ 156 - 100442 (Инициализация клавиатуры и выход в монитор);
ЕМТ 272 - 120000 (Выход в систему БЭЙСИК или ФОКАЛ).
ЕМТ 254 - 0 |
|
ЕМТ 116 - 2 |
ЕМТ 356 - 750 |
ЕМТ 144 - 20 |
ЕМТ 262 - 1000 |
ЕМТ 200 - 120 |
ЕМТ 370 - 1002 |
ЕМТ 172 - 200 |
ЕМТ 370 - 1002 |
ЕМТ 324 - 240 |
ЕМТ 364 - 1006 |
034 - 036:
Эти два слова занимают PC и PSW прерывания по команде TRAP. Прерывание TRAP стандартными драйверами не используется, в системах ФОКАЛ и БЕЙСИК используется в служебных целях: для вывода символов с кодами 0-177 и для вывода сообщения об ошибке. Также можно широко использовать для эмуляции и т.д.
Флаги (байты) состояния дисплея:
040:
Флаг режима 32/64 символа в строке.
041:
Флаг инверсии фона общей зоны экрана.
042:
Флаг режима расширенного ОЗУ.
043:
Флаг РУС/ЛАТ. Кроме того, этот байт служит маской для формирования кодов русских и латинских букв из кодов клавиатуры. Стандартное значение этого байта 200, поэтому при записи в него кода 240 можно будет вводить с клавиатуры только коды заглавных русских букв, кода 40 - только заглавных латинских букв, а код 377 вовсе блокирует ввод букв - клавиатура выдаёт символ «ъ» (клавиши ЗАГЛ и СТР формируют 5-й бит кода клавиатуры).
044:
Флаг режима ПОДЧеркивание символа.
045:
Флаг режима ИНВерсии символа.
046:
Флаг режима ИНДикации Символов Управления.
047:
Флаг режима Блокировки РЕДактирования.
050:
Флаг ГРАФического режима.
051:
Флаг режима ЗАПоминания.
052:
Флаг режима СТИРания. При одновременной установке флагов СТИР и ЗАП работает режим ЗАП. Флаг ГРАФ служит флагом включения одного из графических режимов.
053:
Флаг режима 32/64 символов в служебной строке.
054:
Флаг режима ПОДЧеркивания символов в служебной строке.
055:
Флаг режима ИНВерсии символов в служебной строке.
056:
Флаг режима погашенного курсора.
Ненулевое значение флага свидетельствует о включённом режиме. Отмена режимов осуществляется побитной инверсией флага - командой COM FLAG (кроме флага РУС/ЛАТ), и поэтому при содержимом байта, не равном 0 и 377, режим невозможно выключить, т.е. команда INC FLAG фиксирует данный режим, если он не был включён, и выключает, если режим был включён. Команда DEC FLAG включает режим, если он не был включён, и фиксирует в обратном случае.
060 - 062:
Эти два слова содержат PC и PSW прерывания по нижнему регистру клавиатуры. Адрес обработки - 101136.
064 - 076:
Эти шесть слов не используются драйверами системного ПЗУ.
100 - 102:
Эти два слова содержат PC и SP пользовательского прерывания IRQ2 по сигналу, поданному на контакт ПРТ порта ввода-вывода. Драйверами, БЕЙСИКОМ, ФОКАЛОМ не используются.
При инициализации вектор 100 обнуляется.
БЕЙСИК устанавливает на команду RTI. Адрес - 135070.
ФОКАЛ устанавливает на остаток своей функции FCLK (от ДВК-й версии). Адрес - 132226.
Драйвер клавиатуры:
104:
Код последней нажатой клавиши:
105:
Флаг несчитанного кода, содержит последний несчитанный код. При чтении обнуляется (для ЕМТ 6). До тех пор, пока значение этой линейки не равно 0, нажатие всех прочих клавиш игнорируется.
106:
Слово задержки при ожидании отжатия клавиши «ПОВТ».
110:
Флаг нажатия клавиши «ПОВТ».
111:
Флаг и число выдаваемых пробелов функцией ЕМТ 6 (элемент табуляции). Ненулевое значение байта указывает на то, что при обращении к ЕМТ 6 функция выдаёт код пробела.
112 - 120:
32/64 битовое поле. Каждый установленный бит - затабулированная позиция экрана. Для режима 32 символа в строке слова 116 и 120 не используются.
122:
Слово содержит число выдаваемых символов строки ключа. При нулевом значении строка ключа не выдаётся. Возможное применение этой ячейки - для определения дополнительных ключей клавиатуры, которые вызываются через нажатие клавиши СУ и какой-нибудь буквенной клавишей из набора @,A-G.
Программа, реализующая эту функцию, перехватывает прерывание по верхнему регистру клавиатуры, и при наличии кода ключа устанавливает ячейку 122. Адреса строк ключей располагаются по адресам 126 - 150 (строки упакованные). Вот текст этой программы в формате системы MIRAGE:
001000) 004437 110340 JSR R4,@#110340 001004) 010546 MOV R5,-(SP) 001006) 004737 102052 CALL @#102052 001012) 120027 000007 CMPB R0,#7 001016) 101402 BLOS 1024 001020) 000137 101150 JMP @#101150 001024) 105737 000122 TSTB @#122 001030) 001375 BNE 1020 001032) 006300 ASL R0 001034) 062700 000102 ADD #102,R0 001040) 000137 101450 JMP @#101450
Программа перемещаема, для её работы необходимо заслать по адресу 60 адрес её начальной точки. Слово 102 в команде ADD #102,R0 - это смещение к стандартному расположению массива адресов строк ключей.
124:
Адрес очередного печатаемого символа строки ключей.
126 - 150:
Эти десять слов занимает массив адресов упакованных строк ключей.
Ячейки драйвера дисплея
152:
Флаг нормализации положения курсора. Подпрограмма, осуществляющая нормализацию, располагается по адресу 102414 и осуществляет коррекцию координат курсора при выходе из рабочего поля, а также если установлен флаг 152, осуществляет привязку X,Y координат курсора (ячейку 156) к ячейке 160.
154:
Маска для формирования точек графики, рисуемой курсором в графическом режиме. Возможное применение аналогично ячейке 155.
155:
Маска для формирования точек графики. В режиме 64 символа в строке используется 1 младший бит, при 32 символах в строке - 2 бита. Если же установить остальные биты, то точки графики будут формироваться из большего числа битов, т.е. возможно одну точку формировать из одного байта, проводить линии 3-й - 8-й толщины.
156:
Это слово содержит позицию курсора в формате Х+100*Y (для 64 символов в строке) и X*2+100*Y (для 32 символов в строке).
160:
Это слово содержит адрес верхнего левого (при режиме 32 в строке) угла изображения курсора. При печати символа сначала (для формирования его изображения) используется эта ячейка, а не ячейка 156, а лишь потом осуществляется привязка ячейки 156 к 160-й, поэтому лучше для установки курсора изменять ячейку 160, в противном случае пользоваться нормализацией курсора.
162:
Это слово занимает смещение курсора после печати символа. При режимах 32/64 содержимое её - 2 или 1, но его можно изменить. Чтобы курсор после печати символа смещался в другом направлении, надо заслать в ячейку 162 такие значения:
Режим 64 символа в строке:
1 - вправо;
177777 - влево;
100 - вниз;
177700 - вверх.
Режим 32 символа в строке:
2 - вправо;
177776 - влево;
100 - вниз;
177700 - вверх.
Значение более 1-2 даёт печать символов вразрядку.
Данную функцию смещения мог бы выполнять байт, но из-за отсутствия в системе команд команды байтового сложения используется слово.
164:
Это слово используется при нормализации курсора, в подпрограммах перевода режимов, служит ограничением сверху для ячейки 156. Устанавливая ячейку 164 и другие ячейки, можно перейти на другой размер рабочей области экрана. При обычном режиме равна 3000, в режиме РП - 400.
166:
Это слово используется как расстояние от начала рабочего поля до курсора в режиме графики.
170:
Содержит адрес байта, в котором находится центр графического курсора. В обычном режиме 42000, в режиме РП-72000 (аналогична ячейке 160).
172:
Длина строки, ограничивающей рабочее поле курсора в режиме графики, обычно обнулена, используется в подпрограммах команды ЕМТ 20.
174:
Это слово содержит Х,Y координаты курсора в режиме графики (аналогично ячейке 156).
176:
Это слово занимает X координата графического курсора.
200:
Это слово занимает Y координата графического курсора.
202:
Это слово содержит адрес начала поля служебной строки. Для обычного режима вывода 40000, для режима РП-70000.
204:
Это слово содержит ширину поля служебной строки, т.е. величину, которую надо прибавить к содержимому ячейки 202 для получения адреса начала рабочей области экрана. Обычно равна 2000. При нулевом значении служебная строка не изображается, то есть ячейка 204 - флаг.
206:
Это слово содержит размер области видеоОЗУ в байтах, обычно 40000, в режиме РП - 10000.
210:
Это слово содержит размер рабочей области экрана, т.е. без учёта служебной строки, обычно 36000, т.е. 360 (240 десятич.) телевизионных строк, в режиме РП - 6000 и 60(48).
Устанавливая ячейки 164, 170, 202, 204, 206, 210, можно добиться необходимого размера рабочей области экрана, для того чтобы использовать программы или данные, хранящиеся в видеоОЗУ (так, например, поступает система MIRAGE).
212:
Это слово содержит маску для формирования фона. Используется при очистке экрана, формировании символов и т.д.
214:
Это слово содержит маску для формирования изображения графики, символов в режиме 32 символа в строке, подчёркивания и т.д.
216:
Это слово содержит маску для формирования фона служебной строки. Используется аналогично ячейке 212:
220:
Это слово содержит маску для формирования линии служебной строки. Очистив эту ячейку и нормализовав служебную строку кодом 236, можно погасить линию служебной строки. Это слово также служит флагом для заполнения кодом 30 или 10020 (в зависимости от режима 32/64) одной телевизионной строки ниже линии (100 байт).
222:
Это слово инкриминируется при печати символа, обнуляется при нажатии клавиши и последующей печати символа, т.е. равно (<число напечатанных при нажатии клавиши символов> -1).
224:
При нажатии клавиши происходит прерывание от клавиатуры, которое обрабатывается по адресам 101136 или 101362. При обработке вызывается подпрограмма подзвучки по адресу 102032, которая в зависимости от флага 224 вызывает подпрограмму нормализации режимов служебной строки по адресу 110536, которая проверяет текущие режимы дисплея и устанавливает соответствующие индикаторы в служебной строке. В этой подпрограмме ячейка 224 служит счётчиком. Ячейку 224 устанавливают коды, изменяющие режимы дисплея. Во многих программах нормализация служебной строки является нежелательной, поэтому после выдачи управляющих кодов лучше очистить ячейку 224 во избежание нормализации при случайном нажатии клавиш.
226 - 252:
Эти слова в стандартных подпрограммах не используются, но их использование возможно на БК, оснащённых локальной сетью, другими устройствами.
254:
Это слово является задержкой при передаче на ТЛГ-линию. Её содержимое в зависимости от режима:
Номер |
Скорость (бод) |
Задержка |
---|---|---|
1 |
4800 |
36 |
2 |
2400 |
103 |
3 |
1200 |
213 |
4 |
600 |
435 |
5 |
300 |
1100 |
6 |
150 |
2206 |
7 |
75 |
4422 |
10 |
50 |
6633 |
256:
Это слово не используется подпрограммами обслуживания порта ввода/вывода за неимением таковых, но в руководстве системного программиста сказано о желательности сохранения выводимой информации в порт в ячейке 256.
260:
Это слово содержит адрес обработки программами пользователя нажатия клавиши. При нулевом содержимом обработки не происходит, т.е. ячейка 260 также является флагом.
262:
Это слово является флагом передачи вместо кода 12 (ПС) кода 15 (ВК). Эта возможность практически не используется программами на БК, поэтому по каким-то причинам можно блокировать передачу кода 12 (например, для защиты).
264:
Адрес последнего загруженного в ОЗУ с магнитофона или линии массива данных.
266:
Длина последнего загруженного в ОЗУ с магнитофона или линии массива данных.
270 - 272:
Эти два слова не используются.
274 - 276:
Эти два слова содержат PC и PSW прерывания по нижнему регистру клавиатуры. Стандартный адрес обработки 101362.
300:
Подпрограммами чтения с магнитофона используются как флаг чтения в инверсном сигнале.
301:
Байт ответа драйвера магнитофона.
302:
Это слово используется как флаг фиктивного чтения.
304:
Это слово используется как смещение к счётчику при чтении байта данных, поэтому можно организовать чтение массивов наоборот, вразрядку.
306:
Используется для сохранения адреса блока параметров.
310:
Используется для сохранения SP.
312:
Контрольная сумма массива.
314:
Это слово используется как средняя длина сигнала при чтении для контроля. Вычисляется как средняя длина 200 сигналов настроечной последовательности, умноженная на 1,5. Возможное применение в качестве отношения скорости ЦП и магнитофона.
316:
Не используется.
Блок параметров магнитофона
Расположение блока с адреса 320 рекомендуется в Руководстве и используется пусковым монитором. В Руководстве сказано: «При недостатке места для системного стека драйвера (наибольшая глубина 16) надо расположить блок параметров с другого адреса». Однако при работе драйвера в качестве стека не используется никакая другая область памяти, SP не изменяется, ячейка 310 служит для восстановления стека после прерывания «СТОП» для доступа к данным (вектора прерывания 4) и его восстановления.
320:
Байт команды.
321:
Байт ответа.
322:
Слово адреса массива на запись и чтение.
324:
Слово длины массива на запись и чтение.
326 - 345:
Имя массива на запись или чтение (20 (16 десятич.) символов).
346:
Слово адреса текущего массива.
350:
Слово длины текущего массива.
352:
Имя текущего массива (20(16) символов).
372 - 376:
Эти три слова не используются.
При работе с локальной сетью используются программы, зашитые в ПЗУ Фокала или Бэйсика.
Фокал:
Вектор прерывания 360 (канал связи 11). Адрес обработки 136730.
Бэйсик:
Вектор прерывания 320 (канал связи 7). Адрес обработки 146404.
Список литературы:
- Математическое обеспечение микро-ЭВМ «Электроника БК-0010"
- Руководство системного программиста. - Т.1. - Кн. 2.
Заключение рецензента
Примечания к тексту:
- Для сохранения и последующего восстановления содержимого регистров R0
- R5 можно рекомендовать следующие последовательности команд Ассемблера:
MOV R5,-(R6) MOV R4,-(R6) - сохранение в стеке JSR R4,@#110346
и
JSR R R4,@#110362 MOV (R6)+,R4 - восстановление из стека MOV (R6)+,R5
- Различие между командами RTI и RTT.
При установленном в «1» четвёртом бите («Т») слова состояния процессора (ССП) после выполнения каждой очередной команды происходит прерывание по вектору с адресом 148. При выходе из подпрограммы обработки прерывания по команде RTI бит «Т» ССП сбрасывается в 0, а по команде RTT - устанавливается в 1, поэтому программа, приведённая в качестве примера использования прерывания по биту Т, должна заканчиваться командой RTT, а не RTI:
А$: JSR PC, VIEW$ CMP (SP), #ARD-END BEQ RETS RTT .....
и т.д.
- В «Вычислительной технике» № 11 за 1991 год приведён более полный список «нестандартных» ЕМТ-прерываний.
- В «Вычислительной технике» №12 за 1990 год имеется более подробное описание флагов состояния дисплея, использование ячейки цвета фона, а также подпрограмм сохранения значений регистров в стеке и ввода восьмеричного числа в R5.
- При значениях 1008 и 1777008 в ячейке 1628 происходит сдвиг курсора после печати каждого очередного символа на одну графическую (а не текстовую) строку вверх или вниз.
- Ячейка 1728 содержит количество точек смещения графического курсора, указанное цифровыми клавишами в режиме ГРАФ.
Д.Ю. УСЕНКОВ