Л. И. РАДЧЕНКО

"ЭЛЕКТРОНИКА БК-0010" И РАБОТА С ГРАФО-ТЕКСТОВОЙ ИНФОРМАЦИЕЙ

1990

© "Магистр 2", 1990.

© Л. И. Радченко. 1990.


ВВЕДЕНИЕ

МикроЭВМ БК-0010 всего за несколько лет завоевала широкий круг приверженцев. Большая часть почитателей компьютерных миров в Советском Союзе располагает сегодня именно этой микроЭВМ. Стремительно растет объем программного обеспечения для БК-0010. На рубеже 90-х годов А.Марков и В.Савин разработали интереснейшие игровые программы, другие авторы создали разнообразные и удобные системные программы. В основном, силами кооператоров развивается отрасль тиражирования программ.

Все больший интерес проявляют владельцы микроЭВМ к разработке качественных программ, способных помочь в решении практических задач.

"Электроника БК-0010" предоставляет неплохие возможности для редактирования текстов и рисунков. Программируемый порт ввода-вывода позволяет подключать к БК внешние устройства, например, принтер или графопостроитель, на которые можно вывести созданную графо-текстовую информацию. Существуют довольно эффективные редакторы, способные удовлетворить запросы многих пользователей: текстовый редактор EDASP, графические - ГРАФРЕД и ГРАР, графо-текстовый редактор ГРАТР и его модификации.

Однако не так уж редко необходим такой текстовый, графический или графо-текстовый редактор, который можно было бы встроить во вновь разрабатываемую программу в виде подпрограммы. В этом случае перечисленными готовыми программами не обойтись.

В научно-популярной литературе не найти описания коротких, эффективных редакторов, столь необходимые начинающим программистам.

Это пособие призвано помочь начинающим разобраться в особенностях ввода и отображения информации в БК, показать пути создания редакторов, которые удовлетворяли бы их запросам.

При подготовке пособия считалось, что читатель в определенной мере знаком со структурой микроЭВМ БК-0010, имеет начальные знания по программированию микроЭВМ на языке ассемблера. Новичкам можно порекомендовать предварительно ознакомиться с литературой.

Наш разговор начнем с клавиатуры и устройства отображения информации микроЭВМ. Это необходимо не столько для того, чтобы напомнить о возможностях компьютера, сколько затем, чтобы поговорить о системных параметрах драйвера клавиатуры и устройства отображения информации. Научившись изменять системные параметры непосредственно из редакторов, минуя драйверы, можно будет повысить быстродействие программ. Далее рассмотрим: редактор строки символов, текстовый редактор, редактор символов пользователя. В качестве примеров будем использовать программы, с подробными пояснениями.

Программы приведены в следующем формате: в первом столбце записан адрес команды, во втором - представлено значение, записанное по этому адресу, или команда в машинных кодах, в третьем столбце та же команда, но в мнемонике ассемблера, а в четвертом - пояснения того, что происходит при выполнении данной команды.

Числа и коды в основном приведены в восьмеричной системе счисления. Числа, отмеченные индексом 10, даны в десятичной системе счисления. В десятичной системе приведены и те числа, написание которых не может быть истолковано иначе, например, 228, 99.

Глава 1
КЛАВИАТУРА МИКРОЭВМ БК-0010

1.1. Клавиши и их устройство

Ввод и редактирование графической и текстовой информации осуществляются, в основном, с помощью клавиатуры. У "Электроники БК-0010" встречаются две модификации клавиатуры: "малоходовая", применяющаяся на БК-0010, и "полноходовая" - на БК-0010.01. Каждая из них имеет как достоинства, так и недостатки.

Малоходовая клавиатура - это 92 кнопки ПН-11, распаянные на одной плате. На кнопки наложены квадратные полиэтиленовые колпачки, удерживающиеся с помощью металлической решетки, к которой прикручена плата с кнопками. Решетка с колпачками в свою очередь закрыта толстым полиэтиленом, на который наложен бумажный лист с изображением 86 клавиш. Полиэтилен удерживается лежащим сверху жестким листом прозрачного пластика.

Разница в числе кнопок и клавиш объясняется тем, что четыре из 92 кнопок предназначены для выдачи кода пробела, и по две кнопки - для выдачи кодов ВВОД, регистров РУС и ЛАТ.

Основной недостаток этой клавиатуры заключается в том, что на гладкой пластиковой поверхности пальцы не различают, где кончается одна клавиша и начинается другая, да и жесткость трехслойного "пирога" затрудняет работу на компьютере.

Эти недостатки устранимы: достаточно удалить с клавиатуры полиэтиленовую пленку, лист бумаги с изображением клавиатуры и жесткий пластик. С помощью липкой ленты можно нанести изображения клавиш непосредственно на полиэтиленовые колпачки, накладываемые на кнопки. Теперь можно работать "вслепую". Главное, однако, в том, что на передний план выдвинулись скрытые ранее достоинства малоходовой клавиатуры.

Основное достоинство в том, что можно быстро изменять изображения на клавишах. Для этого на листе бумаги рисуют новые изображения, используемые для какой-либо программы. Такие сменные листы удобны для овладения компьютерной грамотностью, игр для дошкольников и младших школьников, поскольку вместо стандартных надписей можно наклеить любую пиктограмму, например, изображения домов, гор, цветов и т.д.

Кроме того, кнопки ПН-11 надежно защищены от пыли и грязи, поэтому нельзя пожаловаться на надежность малоходовой клавиатуры. Еще одно достоинство в том, что на малоходовой клавиатуре на 12 клавиш больше, чем на полноходовой. То, что клавиши имеют малый ход, существенно упрощает задачу, если идет динамическая компьютерная игра.

У БК-0010.01 - клавиатура полноходовая. Внешне она напоминает традиционную компьютерную клавиатуру, однако не лишена недостатков. У только что приобретенного компьютера вскоре проявлялся "дребезг" клавиш. Причин тому много - одна из них в том, что контактные группы клавиш открыты, и на них накапливается грязь.

Большой ход клавиш неудобен при динамических играх, так как не позволяет быстро вводить информацию в компьютер. Со временем клавиши начинают "западать", изображения на них (кстати, менее информативные, чем у БК) довольно быстро стираются.

Пользователи однако нашли выход: под клавиши они подкладывают тонкий лист поролона, тем самым несколько уменьшают ход клавиш и устраняют их стук об основание; точки трения в клавишах смазывают графитовой смазкой; увеличивают параметры времязадающей цепочки клавиатуры; клавиши покрывают сверху лаком или гравируют на них необходимые изображения.

1.2. Назначение клавиш и их деление

Независимо от того, какая именно клавиатура у вашего компьютера - нажатия на клавиши воспринимаются одинаково.

При каждом нажатии формируется соответствующий код символа, который в дальнейшем обрабатывается программой - драйвером клавиатуры.

Выбор символа и значение кода, генерируемого при нажатии клавиши, зависят от предшествующего состояния регистров клавиатуры, т.е. от того, какие регистры были установлены ранее.

По функциональному назначению клавиши можно разделить на четыре группы: регистровые, управляющие, алфавитно-цифровые и редактирующие.

К регистровым относятся:

Клавиши ЗАГЛ, СТР, НР (AP2), ПР (НР) и СУ при нажатии не вырабатывают код. Коды клавиш РУС - (17) и ЛАТ - (16) используются только драйвером клавиатуры и не передаются в рабочую программу. Однако при пересылке этих кодов в драйвер устройства отображения коды отображаются в виде инвертированных символов N и О латинского алфавита. Включение режима РУС(ЛАТ) индицируется в служебной строке.

Управляющие клавиши предназначены для формирования управляющих кодов и управления режимами работы микроЭВМ.

Алфавитно-цифровые клавиши позволяют вводить коды цифр, специальных символов, заглавных и строчных букв русского и латинского алфавитов, кодов полуграфики, некоторых управляющих кодов (переключения режимов работы дисплея), а также управлять программируемыми ключами.

Коды цифр вводятся при нажатии на цифровые клавиши.

Коды символов, расположенных на клавишах справа (у БК-0010.01 - внизу), вводят при установленном правом (нижнем) регистре.

Заглавные и строчные буквы русского и латинского алфавитов вводят при соответствующей комбинации регистров ЗАГЛ, СТР, РУС, ЛАТ.

Ввод кодов полуграфики, управляющих кодов и управление программируемыми ключами осуществляется при включенным нижнем регистре (регистре АР2 для БК-0010.01).

Редактирующие клавиши позволяют вводить коды символов, выполняющих функции редактирования информации.

Значения кодов символов микроЭВМ БК-0010 (БК-0010.01) приведены в литературе (кодировка КОИ-7), поэтому не будем на них останавливаться.

Клавиатура микроЭВМ БК-0010 позволяет формировать коды символов не только нажатием одной определенной клавиши, но и их комбинациями. В таблице 1 приведены комбинации клавиш, которые соответствуют управляющим символам.

Расшифруем обозначения граф в таблице:

  1. код;
  2. основная комбинация клавиш;
  3. другие комбинации клавиш;
  4. назначение клавиш ЭВМ;
  5. индикация на экране в режиме БЛРЕД, ИСУ;
  6. код в режиме ТС;
  7. назначение кода в драйвере.
1 2 3 4 5 6 7
0   СУ/@ Приостанов работы процессора Инверт.@ 0  
1   СУ/А   Инверт.А 1  
2   СУ/В   Инверт.В 2  
3 КТ СУ/С Конец текста Инверт.С  3 Конец текста
4   СУ/D   Инверт.D 4  
5   СУ/Е   Инверт.Е 5  
6   СУ/F   Инверт.F 6  
7   СУ/G Звуковой сигнал Инверт.G 7 Звуковой сигнал
10 arrow010 СУ/H Перевод курсора влево arrow010 10 Перевод курсора влево
11   СУ/I   Инверт.I 11  
12 Ввод СУ/J Ввод Инверт.J  12 Ввод
13   СУ/К   Инверт.К 13  
14 СБР СУ/L Сброс экрана Инверт.L  14 Сброс экрана
15 Уст.таб СУ/М      15 Уст.позиции табуляции
16 РУС СУ/N Регистр РУС    16 Регистр РУС
17 ЛАТ СУ/О Регистр ЛАТ    17 Регистр ЛАТ
20 СБР.ТАБ СУ/Р      20 Сбр. позиции табуляции
21   СУ/Q     21  
22 arrow022 СУ/R Исходная установка курсора arrow022 22 Исходи, установка курсора
23 ВС СУ/S Перевод курсора в начало текущей строки arrow023 23 Перемещение нижней от курсора части экрана вверх
24 ГТ СУ/T Перевод курсора на 8 позиций вправо arrow024 24 Перемещение нижней от курсора части экрана вниз
25   СУ/U       Перевод курсора в начало следующей строки
26 arrow026 СУ/V Сдвижка в строке arrow026 26 Сдвижка в строке
             
27 arrow027 СУ/W Раздвижка в строке arrow027 27 Раздвижка в строке
30 arrow030 СУ/Х Удаление символа arrow030 30 Удаление символа
31 arrow031 СУ/Y Перемещение arrow031 31 Перемещение
32 arrow032 СУ/Z курсора arrow032 32 курсора
33 arrow033 СУ/[ на одну arrow033 33 на одну
34 arrow034 СУ/\ позицию arrow034 34 позицию
35 arrow035 СУ/] по стрелке arrow035 35 по стрелке
36 arrow036 СУ/^   arrow036 36  
37 arrow037 СУ/_   arrow037 37  
200   НР/СУ/@     0  
201 ПОВТ НР/СУ/A
НР/ПР/0
Повтор Инверт.п  1 Повтор
202 ИСУ НР/СУ/В Индикация  управляющих символов   2 Индикация управляющих символов
203   НР/СУ/С   Инверт.ц 3  
204 БЛ.РЕД НР/СУ/D Блокировка  редактирования   4 Блокировка редактирования
205            
206            
207            
210            
211 ТАБ НР/СУ/I     11 Переход на следующую табулированную позицию
212 НР/ВВОД НР/СУ/J
НР/ВВОД
  Инверт.й 12  
213         13  
214 НР/РП(СБР) НР/СУ/L     14 Режим РП
215   НР/СУ/М
НР/УСТ.ТАБ
  Инверт.м 15  
216   НР/СУ/N
НР/РУС
  Инверт.н 16  
217   НР/СУ/O
НР/ЛАТ
  Инверт.о 17  
220 ШАГ НР/СУ/P
НР/СБР.ТАБ
Пошаговое исполнение Инверт.л 40 Управляющий код
221 НР/ПР/1 НР/СУ/Q Красный Инверт.я 41 Красный
222 НР/ПР/2 НР/СУ/R
НР/arrow022
Синий Инверт.р 42 Синий
223 НР/ПР/3 НР/СУ/S
НР/ВС
Зеленый Инверт.с 43 Зеленый
224 НР/ПР/4 НР/СУ/T
НР/ГТ
Черный Инверт.т 44 Черный
225 ГРАФ НР/СУ/U
НР/СУ/E
НР/ПР/5
  Инверт.Г 5 Графический режим
226 ЗАП НР/СУ/V
НР/СУ/F
НР/ПР/6
НР/arrow026
  Ииверт.3 6 Запись в графическом режиме
227 СТИР НР/СУ/W
НР/СУ/О
НР/ПР/7
НР/arrow027
  Инверт.С 7 Стирание в графическом режиме
230 НР/РЕД НР/СУ/Х
НР/СУ/Н
НР/ПР/8
НР/arrow030
Редактирование Инверт.ь 30 Управляющий код
231 СБР НР/СУ/Y
НР/СУ/К
НР/ПР/9
НР/arrow031
Сброс части строки Инверт.ы 13 Сброс части строки
232 НР/КУРСОР НР/СУ/Z
НР/arrow032
Переключение индикации курсора Инверт.з 72 Переключение индикации курсора
233 НР/(32/64) НР/СУ/[
НР/arrow033
Установка  числа символов в строке Инверт.ш 73 Установка числа символов в строке
234 НР/ИНВ.С НР/СУ/\
НР/arrow034
Инверсия символов Инверт.э 54 Инверсия символов
235 НР/ИНВ.Э НР/СУ/]
НР/arrow035
Инверсия экрана Инверт.щ 55 Инверсия экрана
236 НР/УСТ.ИНД НР/СУ/^
НР/arrow036
Установка индикации в служебной строке Инверт.ч 56 Установка индикации в служебной строке
237 НР/ПОДЧ НР/СУ/_
НР/arrow037
Подчеркивание символов Инверт.ъ 57 Подчеркивание символов

В табличных описаниях комбинаций клавиш владельцы БК-0010.01 должны заменить название регистра НР на АР2.

Некоторые коды (205-210) с клавиатуры сформировать нельзя, поэтому их обычно используют в качестве внутренних кодов программы, как это сделано, например, в интерпретаторе Фокала.

Значительная часть кодов (0-2 и т.д.) не обрабатывается драйвером устройства отображения (телевизора). Эти коды можно использовать для управления программами пользователя.

1.3. Функционирование клавиатуры

Клавиатурой управляет большая интегральная схема К1801ВП1-014, фиксирующая нажатия клавиш и формирующая коды. Для этого БИС клавиатуры использует два системных регистра - состояния клавиатуры и данных клавиатуры.

Регистр состояния клавиатуры предназначен для отображения состояния клавиатуры. Его адрес - 177660.

Если в разряде 6 этого регистра записан 0, то прерывание от клавиатуры разрешено, а если 1 - запрещено. Этот разряд доступен по записи и чтению. Если он установлен в 0, то при установке в 1 разряда 7 по системной магистрали пойдет запрос на прерывание от клавиатуры.

Разряд 7 регистра - это, так называемый, флаг состояния клавиатуры. Он устанавливается в 1 всякий раз, когда в регистр данных клавиатуры поступает новый код и сбрасывается в 0 при чтении регистра данных клавиатуры. Доступен только по чтению. Остальные разряды при этом не используются.

Регистр данных клавиатуры служит для записи кодов клавиатуры. Адрес регистра - 177662. Его разряды используются для записи с клавиатуры семиразрядного кода. Он доступен только по чтению. Запись нового кода не производится до тех пор, пока не будет прочитан предыдущий.

Клавиатура имеет два вектора прерываний с адресами 60 и 274. Это позволяет из 128 семиразрядных кодов, вырабатываемых БИС клавиатуры, получить полный набор восьмиразрядных кодов, используемых в микроЭВМ.

По вектору с адресом 274 обрабатываются коды, формируемые в нижнем регистре, а также некоторые коды, вырабатываемые группой управляющих клавиш.

По вектору 274 обрабатываются коды, формируемые в нижнем регистре, а также некоторые коды управляющих клавиш. Остальные коды обрабатываются по вектору 60.

Кодами, передаваемыми с клавиатуры, занимается программа - драйвер клавиатуры. Его действие заключается в чтении кода из регистра данных и передаче его рабочей программе. Драйвер клавиатуры хранится в ПЗУ пускового монитора с адреса 100742 до адреса 102234 и состоит из нескольких подпрограмм:

Все подпрограммы заканчиваются командой RTS PC (207), поэтому к ним можно обращаться командой JSR PC.

Код передается при поступлении запроса на чтение от рабочей программы, либо, в зависимости от режима, установленного в драйвере, прерыванием рабочей программы.

Как различить два эти режима? Признаком передачи кода по прерыванию служит отличное от нуля содержание ячейки 260. При нажатии на клавишу клавиатуры управление передается соответствующей подпрограмме обработки кодов клавиатуры - по вектору 60 (адрес 101136) или по вектору 274 (адрес 101362). После обработки кода эти подпрограммы в свою очередь обращаются к подпрограмме прерывания рабочей программы, и она рассматривает содержимое ячейки 260 как адрес, по которому необходимо передать управление при обработке прерывания от клавиатуры. Кроме того данная подпрограмма сохраняет в младшем байте ячейки 104 код последней нажатой клавиши. Старший байт этой ячейки служит при этом индикатором считывания последнего кода. Получив управление, рабочая программа может прочитать код, выдав запрос на чтение кода (команда EMT 6), выполнить необходимые действия. Вслед за этим она должна выйти из прерывания, подав команду RTS PC (207).

Если содержимое ячейки 260 было равно нулю, управление рабочей программе при нажатии клавиши не передается, код передается только по запросу EMT 6.

Состоянием ячейки 260 управляет рабочая программа. При инициализации драйвера клавиатуры ячейка 260 обнуляется.

Обработка кодов, получаемых от БИС клавиатуры, зависит от режимов, установленных в драйвере.

Коды букв русского регистра, а также коды, полученные по вектору 274, преобразуются в восьмиразрядные. На то, что установлен именно русский режим, указывает ненулевое (200) содержимое ячейки 43.

При обработке кода, полученного при нажатии клавиши ВВОД, учитывается содержимое ячейки 262. Если там 0, то в рабочую программу передается код 12 (ПС). Если содержимое ячейки отлично от 0, то передается код 15 (ВК). При инициализации драйвера клавиатуры ячейка 262 обнуляется.

Для удобства работы с клавиатурой в драйвере предусмотрена возможность использования горизонтальной табуляции. Для того, чтобы затабулировать любую из 64 позиций в экранной строке, достаточно подвести курсор к нужной позиции и нажать клавишу УСТ.ТАБ. При этом происходит обращение к подпрограмме изменения табуляции, которая использует в качестве переменных ячейки 112, 114, 116, 120, причем каждый разряд соответствует одному знакоместу экранной строки. Подпрограмма также "заглядывает" в ячейку 176, где хранится значение, отвечающее положению курсора на оси X, и изменяет соответствующий разряд в соответствующей ячейке переменных табуляции. На экране в данной позиции под чертой подчеркивания служебной строки появляется соответствующая метка.

При нажатии на клавишу ТАБ курсор пробежит от текущей позиции до первой справа затабулированной позиции, выдавая в рабочую программу соответствующее количество пробелов.

Для сброса табуляции курсор подводят в требуемую позицию и нажимают клавишу СБР.ТАБ. При этом очистится разряд в одной из переменных табуляции и исчезнет соответствующая метка на экране.

Если один и тот же символ необходимо вводить с клавиатуры несколько раз подряд, удобно воспользоваться клавишей ПОВТ. Пока она нажата, по запросам рабочей программы передается код последнего введенного символа. Соответствующая подпрограмма драйвера использует ячейку 106, где записана длительность задержки между выдачей повторных символов, и ячейку НО, в которой указана кратность повтора. Длительность задержки может изменяться от минимального значения 1 до максимального значения 200000, что в микроЭВМ тождественно равно 0. Номинальное значение задержки - 2000, номинальное значение кратности повтора - 1.

Иногда одно и то же слово или фразу требуется вводить с клавиатуры несколько раз. Для этого можно воспользоваться аппаратом программируемых ключей (подпрограмма по адресу 102004). Драйвер позволяет запрограммировать 10 ключей с номерами 1-10 с помощью команды EMT 12 с соответствующими параметрами. При этом драйвер использует системные ячейки с 126 по 150 для хранения адресов, по которым будут размещены тексты ключей.

Тексты ключей извлекают, нажимая цифровые клавиши в нижнем регистре. Драйвер клавиатуры использует ячейку 122 для подсчета числа выдаваемых символов и 124 как индикатор включения счетчика.

Драйвер клавиатуры позволяет приостановить исполнение рабочей программы - для этого достаточно ввести символ @ (регистр СУ). Выполнение рабочей программы продолжится при его повторном вводе или при вводе любого другого символа.

Коды, вырабатываемые при нажатии клавиш РУС, ЛАТ, УСТ.ТАБ, СБР.ТАБ, ТАБ, ПОВТ, необходимы только драйверу клавиатуры - в рабочую программу они не передаются.

1.4. Команды драйвера клавиатуры

При функционирующей рабочей программе возможно обращение к подпрограммам драйвера клавиатуры. Этому служит командное прерывание системных программ EMT 4 - EMT 12, или непосредственное обращение к ним с помощью команды JSR PC.

В первом случае для записи команды необходимо всего одно слово памяти, при этом диспетчеру командных прерываний требуется дополнительное время. Во втором случае для записи программы необходимо два слова памяти, но уменьшается время исполнения подпрограммы.

Рассматривая команды драйвера, будем уделять основное внимание соответствующим системным переменным.

Команда инициализации драйвера клавиатуры

На ассемблере - EMT 4, в кодах - 104004, адрес подпрограммы - 100742.

По команде устанавливаются векторы прерывания клавиатуры.

В регистре состояния сбрасывается маска прерываний от клавиатуры, устанавливается режим передачи кодов по запросам рабочей программы и режим передачи кода 12 при нажатии клавиши ВВОД. Содержимое регистра R0 не сохраняется.

Команда чтения кода с клавиатуры

На ассемблере - EMT 6, в кодах - 104006, адрес подпрограммы - 101010.

Входные данные: R0 - код в младшем байте.

По команде происходит чтение кода с клавиатуры; выдача его повторно по клавише ПОВТ; выдача текста ключа (1 или 10). При работе подпрограммы текущий код записывается в младший байт регистра R0, и управление возвращается вызвавшей программе.

Подпрограмма использует несколько системных ячеек:

Команда чтения строки с клавиатуры

Ассемблер - EMT 10, в кодах - 104010, адрес подпрограммы - 101724.

Входные данные: R1 - адрес ОЗУ для записи строки, R2 - ограничители строки: младший байт - длина строки в байтах (если 0, то 20000 байт), старший байт - код символа-ограничителя строки.

По команде строка вводится по адресу, заданному в R1. Ввод заканчивается, когда выполняется одно из двух ограничивающих условий. Если это ограничивающий символ, то он записывается в конце строки. При вводе строки можно использовать клавишу забоя последнего введенного символа для исправления допущенных ошибок.

После ввода строки в R1 хранится адрес байта, следующего за последним введенным, а в R2 - разность между входным значением и длиной введенной строки.

Команда установки ключей клавиатуры

Ассемблер - EMT 12, в кодах - 104012, адрес подпрограммы - 102004.

Входные данные: R0 - номер программируемого ключа (1-10); R1 - адрес текста ключа (первый байт текста должен определять его длину).

По этой команде программируется ключ с номером, указанным в R0. При этом в системной области запоминается адрес текста соответствующего ключа. Адрес текста ключа 10 запоминается в ячейке 126, а адреса текстов ключей 1-9 в ячейках 130-150 соответственно.

Каждая цифровая клавиша соответствует "ключевому" сообщению с соответствующим номером. При нажатии на заданную цифровую клавишу (в нижнем регистре) драйвер клавиатуры выдает текст ключа.

Если ключ не запрограммирован, никакой реакции на нажатие цифровой клавиши (в нижнем регистре) не последует. Для того, чтобы "сбросить ключ", то есть установить его в незапрограммированное состояние, необходимо задать в качестве параметра нулевое значение адреса ключа.

Содержимое R0 при исполнении команды не сохраняется.

Глава 2
ОТОБРАЖЕНИЕ ИНФОРМАЦИИ В МИКРОЭВМ

Результаты работы микроЭВМ выводятся на устройство отображения: если говорить о БК, то на телевизор (черно-белый или цветной). Формированием телесигнала занимается видеоконтроллер. Рассмотрим, как готовится информация, которой предстоит появиться на экране, уделяя внимание изменениям системных переменных.

2.1. Функционирование видеоконтроллера

Видеоконтроллер микроЭВМ построен на БИС К1801ВП1-037 и обеспечивает сопряжение микроЭВМ и устройств отображения информации. Предназначен он для вывода на черно-белый или цветной бытовой телевизор алфавитно-цифровой и графической информации. Видеоконтроллер регенерирует ОЗУ, где хранится растр телевизионной картинки. Он вырабатывает пять выходных сигналов - R, G, В, SINH, VIDEO, причем первые четыре предназначены для подключения цветного монитора, тогда как VIDEO - это полный телевизионный сигнал, подаваемый на видеовход черно-белого телевизора.

Видеоконтроллер формирует изображение в трех режимах:

Объем памяти, необходимой для работы с растром в каждом из режимов, составляет 1610 Кбайт.

В режиме расширенной памяти, когда объем ОЗУ пользователя расширяется с 1610 до 2810 Кбайт, видеоконтроллер может работать с растровой памятью объемом 4 Кбайт, а размер рабочего поля составляет 6410*51210 точек для работы в режиме 1, и 6410*25610 точек для работы в режимах 2,3.

Изображение на экране формируется за счет непрерывного циклического считывания 16-разрядных слов ОЗУ (растровой памяти) и преобразования данных в последовательность битов. Логической единице, записанной в ОЗУ, на экране соответствует светящаяся точка (пиксел), или, другими словами, каждой точке прямоугольного растра изображения соответствует один бит ОЗУ.

Схема обработки видеосигнала вырабатывает из последовательности битов сигналы управления яркостью и интенсивностью, которые в смеси с синхросигналом поступают на выход видеоконтроллера. Циклическая регенерация изображения и способность люминофора телевизора светиться еще некоторое время после подачи сигнала, создает на экране видимость статической картинки.

В режиме 2 (3) яркость (цвет) каждой точки кодируется последовательными битами считываемого слова, при этом 16-разрядное слово, извлеченное за один цикл обращения к растровой памяти, отображается горизонтальной строчкой из восьми расположенных рядом пикселей (точек растра).

В режиме 1 старший и младший байты отображаются последовательно, но каждый пиксел вдвое уже по горизонтали. Первый байт, имеющий нулевой относительный адрес, располагается в верхнем левом углу экрана, следующий байт - справа от него, а байт, имеющий адрес на 100 больше, - под ним. В правом верхнем углу отображается байт с относительным адресом 77, в левом нижнем - с относительным адресом 37700, в правом нижнем - с относительным адресом 37777.

Видеоконтроллер непрерывно отображает всю область растровой памяти, располагая ее с верхнего левого угла экрана. Выбор адреса байта, с которого начинается отображение, определяет значение регистра смещения.

Регистр обычно используется для рулонного сдвига информации на экране. Для этого задают адрес участка экранного ОЗУ, с которого должен начинаться вывод на экран.

Адрес регистра : 177664. Разряды 0-7 регистра хранят адрес экранного ОЗУ. Изменению младшего разряда на единицу соответствует изменение адреса экранного ОЗУ на 100 байт, то есть длине одной телевизионной строки. Таким образом, изменяя на единицу содержимое регистра смещения, можно смещать изображение на одну строку вверх или вниз. Число комбинаций, задаваемых восемью разрядами, равно 25610, что соответствует 25610 телевизионным строкам, отображаемым на экране. Чтобы привести экран в исходное состояние в регистр смещения необходимо записать константу 330. В этом случае в верхней строке экрана будет отображаться информация, содержащаяся в начале экранного ОЗУ, т.е. с адреса 40000.

Разряд 9 используется для управления режимом расширенной памяти. При этом "0" задает режим отображения 1/4 части экранного ОЗУ с адресами 70000-77777 (режим расширенной рабочей области ОЗУ).

То, что рулонный режим реализован аппаратно (с использованием доступного по записи регистра смещения), позволяет значительно ускорить обработку изображения.

Видеоконтроллер БК-0010 не имеет специальных средств для формирования изображения. Символы и графическую информацию формирует основной процессор и программа - драйвер телевизора.

2.2. Драйвер телевизора

Драйвер расположен в системном ПЗУ пускового монитора по адресам 100140-100256 и 102234-116074, и занимает большую часть его объема.

Эта программа позволяет сформировать на экране 2510 символьных строк, верхняя из них является служебной и предназначена для отображения режимов формирования, а также для вывода служебной информации пользователя.

Каждая строка в текстовом режиме может содержать 6410 символа обычной ширины или 3210 - удвоенной ширины, когда каждой точке соответствуют два бита экранной памяти.

Если отображение служебной строки в экранном ОЗУ начинается с адреса 40000, то начальный адрес отображения строки с номером N (от 0 до 27) можно определить по формуле: A=42000+1200*N.

Каждый стандартный символ формируется в матрице 1010*8 точек, при этом большинство символов используют матрицу 7*5 точек, а исключение составляют некоторые строчные буквы, элементы которых выходят за пределы базовой матрицы, а также символы табличной графики.

В графическом режиме для формирования изображения используется поле 24010*51210 точек (24010*25610 точек, в режиме формирования символов двойной ширины).

В режиме расширения ОЗУ, когда часть экранного ОЗУ отдана программе пользователя, для формирования изображения отводится только 4 Кбайт, в которых помещается одна служебная и четыре информационных строки или графическое поле 4010*51210 точек. Информационное поле в этом случае размещается в верхней части экрана.

Чтобы определить, в каком режиме выводить информацию, драйвер использует следующие ячейки системной области:

Изменяя параметры в ячейках, можно размещать рабочую часть экранного ОЗУ по различным адресам, изменять количество строк, в которых отображается информация. При этом можно использовать для программ не только область до рабочей части экранного ОЗУ (для отображения алфавитно-цифровой информации), но и после этой части.

Предположим, что для отображения информации достаточно всего N строк, тогда по адресу 164 надо записать количество знакомест, равное Z=N*100.

Значение ячейки 202 лучше не изменять. Размер рабочей части, где будет отображаться основная информация, равен R=N*1200.

Это значение помещают по адресу 210, а по адресу 206 записывают общий размер рабочей области P=N*1200+2000.

Начальный адрес, с которого может начинаться рабочая область, должно удовлетворять условию A < 100000-P, то есть для рабочей программы можно использовать области S: 40000 < S < A; A+P < S < 100000.

Предположим, что надо отображать информацию всего в 1010 строках, то есть N = 12. В этом случае по адресу 164 записывают 1200, по адресу 206 - 16400, а по адресу 210 - 14400. Рабочую область можно разместить в начале экранного ОЗУ, записав 40000 по адресу 202, - при этом освобождается область с адреса 56400 до 100000. Если рабочую область разместить в конце экранного ОЗУ, то есть записать 61400 по адресу 202, то свободной окажется область от 40000 до 61400.

Работая в нестандартном режиме расширенной памяти, желательно записать 100377 по адресу 42 и не использовать рулонный сдвиг информации.

2.3. Команды драйвера телевизора

Для управления драйвером служат девять команд системного прерывания EMT. Основной поток информации передается с помощью команды EMT 16.

Команда инициализации драйверного модуля

Команда ассемблера - EMT 14, кодовая - 104014, адрес подпрограммы обработки - 100140.

Команда инициализирует все драйверы системного ПЗУ, сбрасывает все рабочие ячейки драйверов в исходное состояние, устанавливает все вектора прерываний, исходные режимы отображения информации, очищает экран, устанавливает скорость обмена по ТЛГ-линий равной 9600 бод, а также очищает порт ввода-вывода, устанавливает системный порт в исходное состояние. Стек в исходное состояние не устанавливается, и содержимое регистров R0-R4 не сохраняется.

Адреса обработки прерываний, устанавливающиеся при исполнении команды, приведены в таблице 2.

Заметим, что перед установкой начальных параметров драйверов очищаются все ячейки с адреса 40 до адреса 276.

Команда передачи кодов на драйвер

На ассемблере - EMT 16, в кодах - 104016, адрес подпрограммы обработки - 102234.

По этой команде код символа передается драйверу устройства отображения. Входной параметр команды - регистр R0, код символа должен находиться в его младшем байте.

Таблица 2.

Адрес вектора прерывания Источник прерывания Адрес обработки прерывания
0 Переход по нулевому адресу 100000
4 Зависание при передаче данных по каналу или при нажатии клавиши СТОП 100442
10 Резервный код 100000
14 Прерывание по Т-разряду 100000
20 Прерывание по команде IOT 100000
24 Авария сетевого питания 100000
30 Прерывание по команде EMT 100112
34 Прерывание по команде TRAP 100000

По назначению коды символов можно разделить на две основные группы: графических символов и специальных кодов.

Коды графических символов - это коды алфавитно-цифровых символов и символов полуграфики. При поступлении кода графического символа в драйвер код пересчитывается:

Так в R0 формируют единую нумерацию всех кодов (алфавитно-цифровых символов и символов полуграфики, без специальных кодов).

В соответствии с новой нумерацией из массивов, где хранится описание картинок, извлекается массив, соответствующий разложению требуемого символа, и выводится на экран.

Непосредственно выдачей символа на экран заведует подпрограмма, начинающаяся с адреса 102746. Входным параметром для нее служит модифицированное значение кода, записанное в регистре R0. В соответствии с ним подпрограмма вычисляет адрес начала массива, хранящего растр буквы, этот адрес записывается в ре-ре R0. В соответствии с ним подпрограмма вычисляет адрес начала массива, хранящего растр буквы, этот адрес записывается в регистр R1. Часть подпрограммы, начиная с 102764, выводит на экран вычисленный растр.

Массивы с растровыми описаниями символов (графемами) хранятся в памяти, начиная с адреса 112036. Для каждой графемы отведено 12 байт подряд (по числу байт, задействованных в экранной памяти для отображения символа (в режиме 6410 символа в строке)). "Верхнему" байту в экранной памяти соответствует первый байт в массиве разложения, а "нижнему" - последний.

С адреса 112036 по адрес 112274 хранятся массивы разложения для отображения управляющих символов в режиме БЛ.РЕД. С адреса 112276 по адрес 116074 находятся массивы разложения изображений графических символов, начиная с символа ПРОБЕЛ и заканчивая символом ЗАБОЙ (в русском прописном регистре).

При выводе символа на экран, подпрограмма использует несколько системных ячеек:

Пользователь может изменять эти параметры из рабочей программы. Например для того, чтобы передаваемые подряд символы выдавались на экран в столбик, достаточно записать значение 1200 по адресу 162.

Группа специальных кодов - это управляющие, редактирующие переключения режимов формирования информации, переключения режимов работы дисплея и управления режимом текстовой графики.

В подгруппу управляющих входят следующие коды:

Остальные коды в диапазоне 0-14 в драйвере не используются. В режиме ИСУ данные коды отображаются в виде соответствующих символов латинского алфавита и от A до K.

Коды от 15 до 20 при передаче в драйвер отображаются в виде соответствующих инвертированных символов латинского алфавита от M до P.

Редактирующие коды 10, 22-37, 231 обеспечивают соответствующее перемещение курсора на экране или сдвиг по нему информации. В режиме БЛ.РЕД действий не вызывают, а лишь отображаются на экране.

Коды переключения режимов формирования информации

"32/64" (233) - переключение режима формирования символов обычной или удвоенной ширины. Цифры в обозначении кода определяют количество символов в строке в том или ином режиме.

Драйвер позволяет работать с полутоновым или цветным изображением. Для кодировки используются два разряда экранного ОЗУ, то есть можно получить четыре цвета изображения. Самому яркому тону соответствует красный цвет, далее по мере убывания яркости - синий, зеленый, и черный. Цвета переключаются с помощью кодов:

Коды переключения режимов работы дисплея

На включение режимов ПОДЧ, ИНВ.С, ИСУ, БЛ.РЕД указывает индикатор в служебной строке. Для их выключения, а также для выключения режима РП повторно вводят код режима.

Коды управления режимом текстовой графики

Режимом текстовой графики управляют коды ГРАФ, ЗАП, СТИР. В особую подгруппу их выделяют потому, что они открывают доступ к режиму работы драйвера, в котором, передавая драйверу последовательности кодов, можно формировать на экране произвольное графическое изображение. В набор кодов входят коды управления режимом, цифровые и коды, задающие направление курсора.

Драйвер в этом режиме использует следующие системные переменные:

Командами рабочей программы пользователь может изменять значения этих переменных. Например, записав в ячейку 154 значение 52525, определим, что при перемещении курсора в режиме ЗАП, полоса будет закрашиваться зеленым цветом.

Для того, чтобы переместить курсор или отобразить требуемую линию, на вход драйвера в соответствующем режиме передают последовательность кодов - указателей перемещений курсора.

Если важно отобразить линию заданной длины (из заданного числа точек), то ее определяют восьмиричным числом (соответствующим числу точек-пикселей), после чего передают код - указатель направления. При этом на экране появляется линия требуемой длины и направления.

Следует помнить, что в режиме отображения 3210 символа в ТВ-строке умещается 256 точек, а в режиме 6410 до - 512 точек. В режиме 3210 символа в строке, цвет рисуемой линии определяется цветом курсора. Так увеличивается скорость отображения информации и уменьшается объем передаваемой информации, необходимой для формирования изображения.

Если при вводе длины допущена ошибка, вводят код пробела или другой нецифровой код (но не код направления), а затем повторно - длину линии.

Максимальной скорости при минимальном объеме передаваемой информации можно достичь, если при формировании изображения передавать информацию на вход ТВ-драйвера в следующем виде:

- младший байт R0 - код направления,

- старший байт R0 - длина линии данного направления, уменьшенная на 1.

Таким образом, максимальная длина линии - 256 точек. Если в старшем байте хранится 0, появится линия в одну точку.

Для выхода из графического режима повторно вводят код ГРАФ. При этом отменяется действовавший режим, гаснет индикатор в служебной строке и формируется символьный курсор.

Информацию, введенную в режиме текстовой графики, редактируют в символьном виде. Включив режим БЛ.РЕД, выводят на экран графическую информацию, которая распечатывается в виде последовательности символов, в том числе и инверсных. Полученный текст можно редактировать, выключив режим БЛ.РЕД.

Так удается готовить произвольную графическую информацию с помощью редактора текста.

Команда формирования на экране строки символов

На ассемблере - EMT 20, в кодах - 104020, адрес подпрограммы - 107050.

Входные параметры: R1 - адрес массива строки символов в ОЗУ, R2 - ограничитель строки (младший байт - длина строки в байтах, если 0, то длина строки 200000 байт; старший байт символ - ограничитель).

По этой команде последовательность кодов из области ОЗУ, адрес которой задан в R1, передается ТВ-драйверу. Передача прекращается при выполнении одного из ограничивающих условий. В том случае, когда встречается символ-ограничитель, то последним в строке передается код данного символа.

После завершения передачи в R1 хранится адрес байта, следующего за последним переданным, в R2 - входное значение длины строки минус длина переданной строки.

Команда записи символа в служебную строку

Команда ассемблера - EMT 22, в кодах -104022, адрес подпрограммы - 107106.

Записывает символ в указанную позицию служебной строки, причем его формирование производится в соответствии с режимами, действующими в данный момент в основном поле экрана, которые могут быть отличными от режимов формирования индикаторов.

Напомним, что поле индикаторов размещено в правой части служебной строки и может занимать до 24д позиции. С помощью данной команды, а также при вводе кодов УСТ.ИНД, РП осуществляется очистка служебной строки.

Команда установки координат курсора

Команда ассемблера - EMT 24, в кодах - 104024, адрес подпрограммы - 107272.

Входные параметры: R1 - значение координаты X, R2 - значение координаты Y.

Устанавливает символьный или графический курсор в позицию, заданную координатами X и Y. Значениям координат (0,0) соответствует левая верхняя позиция в информационном поле экрана.

Максимальные значения координат зависят от размера поля, которое в данный момент находится в распоряжении пользователя.

Команда съема координат курсора

Команда ассемблера - EMT 26, в кодах - 104026, адрес подпрограммы - 107502.

Входные параметры: R1 - значение координаты X, R2 - значение координаты Y.

Снимает координаты символьного или графического (в зависимости от режима) курсора.

Команда формирования точки по координатам

Команда ассемблера - EMT 30, в кодах - 104030, адрес подпрограммы - 107612.

Входные параметры: R0 - 1-запись, 0-стирание; R1 - значение координаты X; R2 - значение координаты Y.

Записывает или стирает графическую точку по координатам, указанным в качестве параметров. Значениям координат (0,0) соответствует левая верхняя точка на информационном поле экрана.

Максимальное значение координаты Y=23910, максимальное значение X определяется режимом, в котором находится в текущий момент ТВ-драйвер. В режиме 6410 символа в строке Х=51110, а в режиме 3210 символа в строке - Х=25510. С помощью соответствующих команд можно устанавливать цвет (тон) формируемой точки и фона. Для выполнения команды не имеет значения - в символьном режиме или в режиме текстовой графики находится ТВ-драйвер.

Команда формирования вектора по координатам

Команда ассемблера - EMT 32, кодовая - 104032, адрес подпрограммы - 107776.

Входные параметры: R0 - 1 - запись, 0 - стирание; R1 - значение координаты X конца вектора; R2 - значение координаты Y конца вектора.

По данной команде производится запись или стирание вектора, координаты конца которого указаны в качестве параметров. Начало вектора совпадает с координатами последней сформированной точки (с использованием предыдущей команды), либо координатами конца предыдущего вектора.

При формировании вектора действуют все условия и ограничения, приведенные в описании предыдущей команды. Если координаты вектора превышают допустимые значения, формируется только та часть вектора, которая имеет допустимые координаты. При этом координаты конца вектора запоминаются. Таким образом, формируя изображения с координатами, которые превышают размеры экрана, можно наблюдать только часть изображения, помещающегося в информационном поле экрана.

Исполняя четыре последние команды, ТВ-драйвер использует для хранения координат следующие системные ячейки:

Данные параметры можно изменять и непосредственно из рабочей программы. С параметрами отображения информации на экране они связаны зависимостью (166)=mod(206)[(170)-(202)-(204)], где (A) означает содержимое по адресу A.

Команда чтения слова состояния ТВ-драйвера

Команда ассемблера - EMT 34, в кодах - 104034, адрес подпрограммы - 110310.

Выходные параметры: R0 - слово состояния ТВ-драйвера. В ТВ-драйвере при установке режимов отображения изменяется значение системных переменных.

При исполнении команды EMT 34, в зависимости от значений переменных, устанавливаются разряды регистра R0 - если значение переменной отлично от 0, то в соответствующий разряд записывается 1, а если равно 0, то обнуляется и соответствующий разряд регистра.

Формат слова представлен в таблице 3. При установке режимов можно обращаться непосредственно к системным переменным. Например, для установки режима работы с графической информацией достаточно записать по адресу 50 значение 177777. Для определения количества символов, которые можно отобразить в строке, достаточно опросить состояние ячейки 40.

Таблица 3. Формат слова состояния ТВ-драйвера.

Номер разряда R0 Адрес ячейки Соответствующий режим
0 40 Режим "32 символа в строке”
1 41 Инверсия фона
2 42 Режим расширенной памяти
3 43 Русский регистр
4 44 Подчеркивание символа
5 45 Инверсия символа
6 46 Индикация СУ
7 47 Блокировка редактирования
10 50 Режим текстовой графики ГРАФ
11 51 Запись в режиме ГРАФ
12 52 Стирание в режиме ГРАФ
13 53 Режим "32 символа в служебной строке"
14 54 Подчеркивание символа в служебной строке
15 55 Инверсия символа в служебной строке
16 56 Гашение курсора
17 57 Не используется

Приведем пример изменения системных параметров из рабочей программы.

Как, например, выдать в определенные точки экрана строки символов в процессе исполнения программы? Воспользуемся таким форматом записи:

1-е слово - текущий номер положения курсора (K=100-y+x, где К - номер положения курсора, у - номер строки, х - номер знакоместа);

2-е слово

- младший байт (если в него записано 377, информацию выдают в режиме 32 символа в строке, а если 0 - то 64 символа в строке);

- старший байт (длина строки символов); далее идут коды символов.

Выводом символов заведует подпрограмма, перед обращением к которой в регистр R4 следует записать адрес первого слова строчки символов.

Подпрограмма вывода строчки символов.

1000 012437 MOV (R4)+,@#156 Записали в ячейку 156 требуемое положение курсора.
1002 000156    
1004 112437 MOVB(R4)+,@#40 Записали в ячейку 40 требуемое число символов в строке
1006 000040    
1010 105737 TSTB @#40 и установили соответствующий шаг выдачи символов.
1012 000040    
1014 001404 BEG 1026  
1016 012737 MOV #2,@#162  
1020 000002    
1022 000162    
1024 000403 BR 1034  
1026 012737 MOV #1,@#162  
1030 000001    
1032 000162    
1034 104026 EMT 26 Установили курсор в требуемую позицию.
1036 104024 EMT 24  
1040 112402 MOVB (R4)+,R2 Выдали строчки символов.
1042 010401 MOV R4,R1  
1044 104020 EMT 20  
1046 000207 RTS PC  

Достоинство этой подпрограммы и формата записи заключается в том, что строчка символов будет выдаваться всегда в одном месте и в одном режиме отображения, независимо от состояния ТВ-драйвера.

Итак, мы рассмотрели возможности обработки графо-текстовой информации, заложенные в ПЗУ микроЭВМ. Однако для создания эффективных программ эти возможности недостаточны. Повысить эффективность можно за счет программ-редакторов, записываемых в ОЗУ.

ГЛАВА 3
РЕДАКТОРЫ ГРАФО-ТЕКСТОВОЙ ИНФОРМАЦИИ

Кто хотя бы раз попытался использовать компьютер для обработки информации, будет стремиться расширить сферу его применения в повседневной жизни для решения как профессиональных, так и для бытовых вопросов.

В различных случаях требуются и различные редакторы. Поскольку объем ОЗУ БК-0010 сравнительно невелик (в 16д Кбайт памяти можно записать всего 7-10 страниц машинописного текста), для решения некоторых задач по переработке информации необходимы и специализированные редакторы, прежде всего потому, что универсальный редактор не может поместиться в памяти.

В настоящее время для БК-0010 созданы довольно неплохие редакторы: текстовый EDASP, графический ГРЕД, пакет программ графо-текстовой печати ГРАТЕП, а также система РИГА, обеспечивающая создание и редактирование как демонстрационных, так и игровых программ. Чаще всего эти разработки вполне могут удовлетворить пользователя, однако, создавая специфические программы, программист нередко нуждается в редакторе, отвечающем вполне определенным требованиям, которым не удовлетворяет ни одна из названных программ.

Ситуация не безвыходная, и чтобы научиться самостоятельно выходить из нее, рассмотрим примеры реализации некоторых редакторов - строки, кадра, символов или марок. Редакторы разработаны для игровых программ пакета МИР ПРИКЛЮЧЕНИИ, однако, их нетрудно адаптировать в соответствии со своими намерениями.

3.1. Редактор строки

Редактирование строки символов необходимо, например, для определения или изменения клавиш управления программой. Считается, что в памяти машины отведены подряд несколько слов, в которых записаны коды, выдаваемые клавиатурой при нажатии клавиш, например, для перемещения изображения символа вправо, влево, вверх, вниз и т.д.

Для такого редактора можно было бы применить команду EMT 10, но в этом случае возможности редактирования были бы весьма ограничены: Основное неудобство заключается в том, что так нельзя изменить в строке даже один символ, не изменяя остальные.

Воспользуемся в качестве примера редактором, обеспечивающим изменение любого кода, записанного в редактируемом массиве.

Пусть в программе с адреса 2740 выделена строка длиной в 10 слов для хранения кодов клавиш управления программой. Для изменения значений кодов в программе имеется редактор клавиатуры (редактор строки символов). Данный редактор должен обеспечить отображение на экране:

Хотя в приведенном примере даны реальные адреса в программах пакета МИР приключений, при необходимости их всегда можно адаптировать к любой конкретной программе.

АДРЕС ЗНАЧЕНИЕ МНЕМОНИКА АССЕМБЛЕРА ПОЯСНЕНИЯ
16230 012701 MOV #7,R1 В начале подпрограммы в двух строках выводим на
16232 000007   экран функциональное назначение клавиш,
16234 012702 MOV #6,R2 необходимых для управления программой.
16236 000006    
16240 104024 EMT 24  
16242 012701 MOV #16632,R1 Например, слова "ДВИЖЕНИЕ, СТРЕЛЬБА" (записаны в программе, начиная с адреса 16632).
16244 016632    
16246 012702 MOV #22, R2  
16250 000022   Так же выводим
16252 104020 EMT 20 изображения направлений
16254 012701 MOV #5,R1 движения и стрельбы (влево, вправо, вверх, вниз),
16256 000005   записанные в программе с адреса 16656.
16260 012702 MOV #10,R2  
16262 000010    
16264 104024 EMT 24  
16266 012701 MOV #16656,R1  
16270 016656    
16272 012702 MOV #26,R2  
16274 000026    
16276 104020 EMT 20  
16300 012701 MOV #5,R1 Ниже на экран выводим
16302 000005   изображения клавиш, выбранных для реализации функций управления.
16304 012702 MOV #12,R2  
16306 000012    
16310 104024 EMT 24  
16312 012703 MOV #2740,R3  
16314 002740    
16316 012704 MOV #10,R4  
16320 000010    
16322 012300 MOV (R3)+,R0  
16324 004737 JSR PC, @#16510  
16326 016510    
16330 012700 MOV #40,R0  
16332 000040    
16334 104016 EMT 16  
16336 104016 EMT 16  
16340 077410 SOB R4,16322  
16342 004737 JSR PC,@#16540 В нижней части экрана выводим информацию о том, как редактировать строку.
16344 016540    
16346 012702 MOV #12,R2 На редактируемый
16350 000012   символ строки
16352 104024 EMT 24 устанавливаем курсор и
16354 012700 MOV #232,R0 ожидаем нажатия клавиши.
16356 000232    
16360 104016 EMT 16 При этом регистр R3 будет
16362 012703 MOV #2740,R3 указывать адрес редактируемого символа.
16364 002740    
16366 104006 EMT 6  
16370 042700 BIC #177400,R0 После получения кода с
16372 177400   клавиатуры определяем,
16374 104026 EMT 26 что он означает - перемещение курсора (26,27)
16376 020027 CMP R0,26 или изменение кода.
16400 000026    
16402 001011 BNE 16426 При перемещении курсора
16404 020127 CMP R1,#5 влево определяем, не на
16406 000005   первый ли символ он указывает,
16410 101766 BLOS 16366 если нет, то перемещаем
16412 162701 SUB #3,R1 курсор влево, изменяя
16414 000003   соответственно значение
16416 162703 SUB #2,R3 (R3), указывающего адрес
16420 000002   редактируемого символа.
16422 104024 EMT 24  
16424 000760 BR 16366  
16426 020027 CMP R0,#27 При поступлении кода перемещения
16430 000027   курсора вправо,
16432 001011 BNE 16456 проверяем - не достигнут
16434 020127 CMP R1,#32 ли край. Если "нет", то перемещаем
16436 000032   курсор и изменяем
16440 103352 ВСС 16366 значение указателя адресов
16442 062701 ADD #3,R1 редактируемых символов.
16444 000003    
16446 062703 ADD #2,R3  
16450 000002    
16452 104024 EMT 24  
16454 000744 BR 16366  
16456 020027 CMP R0,#15 Если была нажата клавиша
16460 000015   ВВОД, осуществляется переход
16462 001003 BNE 16472 на выход из редактора.
16464 000207 RTS PC  
16466 000240 NOP  
16470 000240 NOP  
16472 010013 MOV R0,(R3) При нажатии любой другой
16474 004737 JSR PC,@#16510 клавиши производим запись
16476 016510   кода нажатой клавиши в
16500 012700 MOV #10, R0 ячейку, на которую указывает R3.
16502 000010    
16504 104016 EMT 16  
16506 000727 BR 16366  

Подпрограмма выдачи на экран символа в режиме БЛ.РЕД.

16510 010046 MOV R0,-(SP) Сохраняем значение регистра R0 в стеке.
16512 012700 MOV #204,R0 Включаем режим БЛ.РЕД.
16514 000204    
16516 104016 EMT 16  
16520 111600 MOVB (SP),R0 Выводим на экран изображение символа.
16522 104016 EMT 16  
16524 012700 MOV #204,R0 Выключаем режим БЛ.РЕД.
16526 000204    
16530 104016 EMT 16  
16532 012600 MOV (SP)+,R0 Из стека восстанавливаем
16534 000207 RTS PC значение регистра R0 и возвращаемся в вызвавшую программу.
16536 000000 HALT  

Подпрограмма вывода информации по редактированию строки

16540 012701 MOV #1,R1 Выводим на экран информацию о том,
16542 000001   как переводить
16544 012702 MOV #14,R2 курсор, уменьшая адрес символа
16546 000014   в редактируемой строке.
16550 104024 EMT 24  
16552 012701 MOV #16706,R1  
16554 016706    
16556 012702 MOV #20,R2  
16560 000020    
16562 104020 EMT 20  
16564 012700 MOV #26,R0  
16566 000026    
16570 004737 JSR PC,@#16510  
16572 016510    
16574 012701 MOV #016730,R1 Выводим на экран информацию о том,
16576 016730   как переводить
16600 012702 MOV #13,R2 курсор, увеличивая адрес
16602 000013   символа в редактируемой
16604 104020 EMT 20 строке.
16606 012700 MOV #27,R0  
16610 000027    
16612 004737 JSR PC,@#16510  
16614 016510    
16616 012700 MOV #56,R1  
16620 000056    
16622 104016 EMT 16  
16624 012701 MOV #5,R1  
16626 000005    
16630 000207 RTS PC  

В данной подпрограмме нет массивов (с начальными адресами 16632, 16656, 16706, 16730), в которых должна быть записана служебная текстовая информация. Эти массивы можно задать самостоятельно в соответствии с функциональным назначением кодов редактируемой строчки символов.

3.2. Редактор кадра

При обработке информационных массивов пользователю доступна вся информация, которую можно отобразить на экране телевизора.

Условимся называть кадром информационный массив, отображаемый на экране. Если речь идет о текстовом массиве, несложно подсчитать объем кадра. Поскольку на экране отображается S строк по В символов в строке, объем кадра составляет: К = S * В [символов].

Например, если в строке можно отобразить 40 символов, а всего задействовано 20 строк, объем кадра будет равен 1000 символов. Поскольку для записи кода символа используется один байт, то для всего кадра в памяти надо отвести также 1000 байт.

Для ввода и редактирования информации необходимо:

Рассмотрим редактор кадра, использованный в пакете игровых программ "Мир приключений".

Чтобы получить на экране изображение лабиринтов, осуществляется отображение элементов символьного массива. С помощью редактора кадра можно изменить вид отдельного лабиринта.

В данном случае размер кадра 20 строк по 40 символов, то есть 1000 символов.

Для формирования картинки лабиринта и изображений его "обитателей" использованы всего 10 символов, которым ставятся в соответствие коды от 0 до 7. Символы обозначают человечков, пауков, землю, дерево, грибок и т.д.

Каждому символу в программе соответствует фрагмент, хранящий массив разложения его изображения (графема). Редактирование графем рассмотрим в следующем параграфе, а пока что остановимся подробнее на редакторе кадра.

При редактировании программа использует следующие ячейки:

21310 - 22306 - для хранения собственно кадра информации;

2700 - указатель адреса слова, в которое записана верхняя строчка изображения символа, (его знакоместо при этом выделено курсором);

2702 - указатель адреса байта, знакоместо которого отмечает курсор.

Работая с редактором, с клавиатуры можно вводить коды, в соответствии с которыми курсор будет перемещаться по экрану (указывая знакоместо, подлежащее редактированию). Коды цифр 0-7 определяют запись символов с 0 по 7 в кадр кодов.

Редактор активизируется после того, как на экран выводится изображение кадра (лабиринта) в режиме 40 символов в строке и включается курсор.

Программа редактора кадра

12064 012737 MOV #44400,@#2700 Изображение кадра выведено
12066 044400   с адреса экранной
12070 002700   памяти 44400, который записан в указатель в экране.
12072 012737 MOV #021310,@#2702 Указатель в кадре установлен
12074 021310   на начало кадра.
12076 002702    
12100 012701 MOV #0,R1 Курсор установлен на левый
12102 000000   верхний угол изображения кадра.
12104 012702 MOV #2,R2  
12106 000002    
12110 104024 EMT 24  
12112 104006 EMT 6 Ожидание ввода кода с клавиатуры.
12114 042700 BIC #177400,R0 Значение полученного кода
12116 177400   сравнивается со значениями,
12120 012701 MOV #12140,R1 начиная с адреса 12142.
12122 012140   Массив состоит из пар
12124 062701 ADD #2,R1 слов. В первом слове пары
12126 000002   записан код символа
12130 005711 TST (R1) или управляющий код, а во
12132 001761 BEG 12112 втором слове - адрес программы,
12134 020021 CMP R0,(R1)+ обеспечивающей
12136 001372 BNE 12124 обработку информации в соответствии
12140 000131 JMP @(R1)+ с данным кодом.
12142 000010   Массив кодов и адресов программ,
12144 012330   обеспечивающих обработку информации по данным кодам.
. . .      
12206 000036   Поскольку все программы
12210 012606   однотипны, приведем описания только двух программ перемещения курсора по диагонали вправо-вниз
. . .     и записи кода символа 0.
12252 000060    
12254 012712    
. . .      

Программа перемещения курсора по диагонали вправо-вниз

12606 104026 EMT 26 Определено положение курсора.
12610 020227 CMP R2,#24 Если курсор стоит на
12612 000024   правой или нижней границе
12614 101014 BHI 12646 изображения кадра, то изменения
12616 020127 CMP R1,#34 не производятся. Следует
12620 000034   переход на ожидание
12622 101011 BHI 12646 ввода кода с клавиатуры.
12624 062737 ADD #1202,@#2700 Указатель в экране переводится
12626 001202   на соответствующий
12630 002700   адрес экранной памяти.
12632 062737 ADD #41,@#2702 Указатель в кадре переводится
12634 000041   на соответствующий
12636 002702   адрес в информационном массиве.
12640 012700 MOV #36,R0 Курсор на экране перемещается
12642 000036   в соответствующем
12644 104016 EMT 16 направлении.
12646 000137 JMP 12112 Конец программы. Переход
12650 012112   на подпрограмму ожидания ввода следующего кода.
. . .      

Программа записи в кадр кода символа 0

12712 012701 MOV #17750,R1 В регистр R1 записан адрес
12714 017750   начала массива разложения символа 0.
12716 013702 MOV @#2700,R2 В регистр R2 записан адрес
12720 002700   экранной памяти, начиная с которого надо отобразить символ по введенному коду.
12722 012703 MOV #12,R3 На экран выведено юображение
12724 000012   символа; цифровой код
12726 012112 MOV (R1)+,(R2) которого был введен с
12730 005112 COM (R2) клавиатуры.
12732 062702 ADD #100,R2  
12734 000100    
12736 077305 SOB R3,12726  
12740 162700 SUB #60,R0 В соответствующую позицию
12742 000060   кадра записан код 0.
12744 013701 MOV @#2702,R1  
12746 002702    
12750 110011 MOVB R0,(R1)  
12752 000735 BR 12646 Переход к ожиданию ввода кода с клавиатуры.

В играх и прикладных программах отображение кадра не из массива данных, где хранятся все кадры, а из так называемого буфера, - специально отведенной в памяти машины области.

При необходимости кадр с места хранения пересылается в буфер, где производится его обработка. Если обработка завершена, то по ее окончанию кадр пересылается из буфера на место постоянного хранения. Этим обеспечивается сохранность информации, если по каким-либо причинам обработка завершилась неправильно. Кроме того в играх и прикладных программах для кодировки символов в кадре нередко используется различное число кодов - 4, 10, 20, 40, 100, 200.

Для записи этих кодов требуется, соответственно 2, 3, 4, 5, 6, 7 разрядов. Если для записи значений этих кодов использовать целый байт, то память машины будет занята нерационально.

Для уменьшения объема памяти, необходимого для хранения одного кадра информации, применяют уплотнение кодов символов в одном машинном слове. Например, если в программе используется 4, 10, 20, 40, 100 символов, то в одном шестнадцатиразрядном слове памяти может быть записано соответственно 10, 5, 4, 3 кода, а кадр в памяти будет занимать в полтора-четыре раза меньше места.

Уплотнение и разуплотнение кадра в этом случае производят при пересылке его из буфера на место для хранения и обратно.

Рассмотрим конкретный пример. Допустим, был отредактирован кадр, записанный в буфере с начальным адресом 21310. Массив для хранения кадров расположен в памяти машины с адреса 22310. В программе используется 10 символов, то есть для записи кода символа требуются три разряда, и в одном слове должны храниться 5 кодов символов. Так как объем кадра составляет 1000 символов, то для его уплотненной записи требуется более 146 слов или более 314 байт. Предположим, в массиве хранения для кадра отведено 320 байт. В ячейке 2710 записан номер кадра в массиве хранения. Номера кадров начинаются с единицы.

Программа уплотнения кадра в массив хранения

13120 012737 MOV #21310,@#2702 В ячейке 2702 записан
13122 021310   адрес начала буфера.
13124 002702    
13126 012700 MOV #2177,R0 В регистре R0 - фиктивное
13130 021770   начало кадра с номером 0.
13132 013702 MOV @#2710,R2 В регистре R2 - номер обрабатываемого
13134 002710   кадра. Рассчитывается
13136 062700 ADD #320,R0 начальный
13140 000320   адрес кадра в массиве
13142 077203 SOB R2,13136 хранения и направляется
13144 010037 MOV R0,@#2704 в ячейку 2704.
13146 002704    
13150 062700 ADD #320,R0 В ячейке 2706 запоминается
13152 000320   адрес начала следующего
13154 010037 MOV R0,@#2706 кадра в массиве хранения.
13156 002706    
13160 005000 CLR R0 В регистре R0 упаковываются
13162 000241 CLC пять кодов символов,
13164 012701 MOV #5,R1 взятых из кадра, расположенного
13166 000005   в буфере. При
13170 006100 ROL R0 этом ячейка 2702 является
13172 006100 ROL R0 указателем текущего кода
13174 006100 ROL R0 в буфере, а ячейка 2704 -
13176 013703 MOV @#2702,R3 указателем текущего слова
13200 002702   в массиве.
13202 111302 MOVB (R3),R2  
13204 150200 BISB R2,R0  
13206 005237 INC @#2702  
13210 002702    
13212 077112 SOB R1,13170  
13214 013701 MOV @#2704,R1 Слово с упакованными
13216 002704   кодами записывается в
13220 010011 MOV R0,(R1) массив для хранения.
13222 062737 ADD #2,@#2704  
13224 000002    
13226 002704    
13230 023737 СМР @#2704,@#2706 Если в массиве не конец
13232 002704   кадра, то следует переход
13234 002706   на уплотнение кодов
13236 100750 BMI 13160 в регистре R0.
. . .      

Приведем программу, осуществляющую пересылку с разуплотнением кадра. Информация считывается в буфер из массива хранения, а изображение кадра выводится на экран.

Программа разуплотнения кодов символов

04616 012701 MOV #21770,R1 Расчет адреса начала
04620 021770   кадра в массиве. Адрес
04622 013700 MOV @#2710,R0 хранится в ячейках 2702
04624 002710   и 2706.
04626 062701 ADD #320,R1  
04630 000320    
04632 077003 SOB R0,4626  
04634 010137 MOV R1,@#2702  
04636 002702    
04640 012737 MOV #21310,@#2704  
04642 021310    
04644 002704    
04646 010137 MOV R1,@#2706  
04650 002706    
04652 012737 MOV #44400,@#2720 Адрес начала кадра в
04654 044400   экранном ОЗУ записан
04656 002720   в ячейку 2720.
04660 012737 MOV #20, @#2712 В ячейку 2712 записано
04662 000020   число строк изображения.
04664 002712    
04666 013703 MOV @#2720,R3 Регистр R3 станет указателем
04670 002720   места записи в экранном ОЗУ.
04672 012705 MOV #150,R5 Всего упакованный кадр
04674 000150   занимает 150 слов.
04676 010546 MOV R5,-(SP) Число слов, не прошедших разуплотнение, направляется на хранение в стек.
04700 013701 MOV @#2706,R1 В регистр R1 записано
04702 002706   следующее слово, подлежащее
04704 011100 MOV (R1),R0 разуплотнению.
04706 012704 MOV #5,R4 Всего в слове упаковано
04710 000005   пять кодов символов.
04712 010002 MOV R0,R2 В регистре R2 сформировано
04714 042702 BIC #107777,R2 значение следующего
04716 107777   разуплотненного кода.
04720 012701 MOV #14,R1  
04722 000014    
04724 006002 ROR R2  
04726 077102 SOB R1,4724  
04730 013701 MOV @#2704,R1 В регистр R1 передан адpec
04732 002704   в буфере, по которому должен быть записан код.
04734 010205 MOV R2,R5 В соответствии с полученным
04736 006305 ASL R5 кодом следует переход на программу формирования
04740 000175 JMP @#(4744+R5) изображения символа на экране.
04742 004744   Каждый символ может иметь свои специфические параметры, которые формируются при его выводе на экран.
. . .      

Программа формирования изображения символа на экране

05146 110211 MOVB R2,(R1) Код символа записан в буфер.
05150 000241 CLC В регистре R1 подготовлен
05152 006100 ROL R0 для обработки следующий код.
05154 006100 ROL R0  
05156 006100 ROL R0  
05160 005137 INC @#2704 Указатель в буфере передвинут
05162 002704   на следующую позицию.
05164 012701 MOV #17724,R1 В регистре R1 сформирован
05166 017724   адрес начала массива
05170 005202 INC R2 разложения выводимого
05172 062701 ADD #24,R1 символа.
05174 000024    
05176 077203 SOB R2,5172  
05200 012702 MOV #12,R2 На экран выведено изображение символа.
05202 000012    
05204 012113 MOV (R1)+,(R3)  
05206 062703 ADD #100,R3  
05210 000100    
05212 077204 SOB R2,5204  
05214 032703 BIT #76,R3 Произведен расчет адреса,
05216 000076   по которому должно будет
05220 001003 BNE 5230 выводиться изображение
05222 162703 SUB #76,R3 следующего символа.
05224 000076    
05226 000402 BR 5234  
05230 162703 SUB #1176,R3  
05232 001176    
05234 005304 DEC R4 Если разуплотнены не все
05236 001225 BNE 4712 коды слова, то осуществляется переход к следующему коду.
05240 062737 ADD #2,@#2706 Если не весь кадр переслан
05242 000002   в буфер, то осуществляется
05244 002706   переход к следующему
05246 012605 MOV (SP)+,R5 слову массива.
05250 005305 DEC R5  
05252 001211 BNE 4676  

Заметим, что аналогичным образом формируется изображение в играх LODE RUNNER, ТАРЗАН, ДЕСАНТНИК. Неясным остается одно - как же были сформированы массивы разложения символов?

3.3. Редактор символа

Редакторы символов применяются в некоторых системных и игровых программах - системе РИГА, редакторе графо-текстовой печати ГРАТР, пакете игровых программ МИР приключений. Требования к редактору символов аналогичны тем, что предъявляют к редактору кадра.

При редактировании символа необходимо иметь возможность задавать или изменять один-два разряда в слове разложения символа. Это означает, что для редактирования необходимы коды, количество которых составляет два для черно-белого изображения и четыре для цветного.

Можно считать, что в слове разложения символа упаковано 20 или 10 кодов символов соответственно.

Массив разложения символа рассматривается аналогично кадру, записанному в массив хранения. Для редактирования массив разложения символа пересылается в буфер с разуплотнением.

При выводе изображения каждый разряд или два разряда отображаются в виде символа ЗАБОЙ, цвет которого определяется по правилу:

код символа цвет символа ЗАБОЙ
0 черный
1 зеленый
2 синий
3 красный

Редактирование разуплотненного массива разложения символа, который находится в буфере, осуществляется аналогично редактированию кадра алфавитной информации. При пересылке отредактированного массива на место для хранения производится его уплотнение.

В процессе работы программы символ может отображаться без разуплотнения массива или, напротив, разуплотнение может осуществляться с небольшим коэффициентом увеличения (в 2 или 4 раза), что позволяет выводить символы в два-четыре раза большего размера.

ЗАКЛЮЧЕНИЕ

Наличие в программах как прикладных, так и игровых, разнообразных средств обработки графо-текстовой информации значительно повышает их эффективность.

Автор надеется, что это небольшое пособие поможет начинающим программистам обрабатывать графо-текстовую информацию, освоить имеющиеся программные инструменты и поможет созданию разнообразных программ.

В пособии не были рассмотрены графические редакторы, поскольку они практически не отличаются по своим возможностям от редакторов символов. Графические редакторы, как и редакторы символов оперируют с массивами хранения информации, которые пересылаются в экранную область ОЗУ для формирования изображения.

ЛИТЕРАТУРА

  1. Математическое обеспечение микроЭВМ "Электроника БК0010". Язык Фокал. Т.1, книга 1, 1985.
  2. Математическое обеспечение микроЭВМ "Электроника БК0010". Руководство системного программиста. Т.1, книга 2, 1985.
  3. Архитектура ЭВМ PDP-11, VAX-11 и программирование на языке ассемблера. Радио и связь, М., 1989.
  4. Осетинский Л.Г., Осетинский М.Г., Писаревский А.Н. Фокал для микро и мини-компьютеров. Машиностроение, 1988.
  5. Пакет программ "Мир приключений", 1988.
  6. Пакет программ графо-текстовой печати "Гратеп", 1988.
  7. Система "Рига", 1985.
  8. Программа LODE RUNNER.

ОГЛАВЛЕНИЕ


Цена 5 руб.

Ротапринт ВНИИЭСМ

Зак.369. Тир.10000. 1990.


OCR 2003, assur
Hosted by uCoz