Л. И. РАДЧЕНКО
1990
© "Магистр 2", 1990.
© Л. И. Радченко. 1990.
МикроЭВМ БК-0010 всего за несколько лет завоевала широкий круг приверженцев. Большая часть почитателей компьютерных миров в Советском Союзе располагает сегодня именно этой микроЭВМ. Стремительно растет объем программного обеспечения для БК-0010. На рубеже 90-х годов А.Марков и В.Савин разработали интереснейшие игровые программы, другие авторы создали разнообразные и удобные системные программы. В основном, силами кооператоров развивается отрасль тиражирования программ.
Все больший интерес проявляют владельцы микроЭВМ к разработке качественных программ, способных помочь в решении практических задач.
"Электроника БК-0010" предоставляет неплохие возможности для редактирования текстов и рисунков. Программируемый порт ввода-вывода позволяет подключать к БК внешние устройства, например, принтер или графопостроитель, на которые можно вывести созданную графо-текстовую информацию. Существуют довольно эффективные редакторы, способные удовлетворить запросы многих пользователей: текстовый редактор EDASP, графические - ГРАФРЕД и ГРАР, графо-текстовый редактор ГРАТР и его модификации.
Однако не так уж редко необходим такой текстовый, графический или графо-текстовый редактор, который можно было бы встроить во вновь разрабатываемую программу в виде подпрограммы. В этом случае перечисленными готовыми программами не обойтись.
В научно-популярной литературе не найти описания коротких, эффективных редакторов, столь необходимые начинающим программистам.
Это пособие призвано помочь начинающим разобраться в особенностях ввода и отображения информации в БК, показать пути создания редакторов, которые удовлетворяли бы их запросам.
При подготовке пособия считалось, что читатель в определенной мере знаком со структурой микроЭВМ БК-0010, имеет начальные знания по программированию микроЭВМ на языке ассемблера. Новичкам можно порекомендовать предварительно ознакомиться с литературой.
Наш разговор начнем с клавиатуры и устройства отображения информации микроЭВМ. Это необходимо не столько для того, чтобы напомнить о возможностях компьютера, сколько затем, чтобы поговорить о системных параметрах драйвера клавиатуры и устройства отображения информации. Научившись изменять системные параметры непосредственно из редакторов, минуя драйверы, можно будет повысить быстродействие программ. Далее рассмотрим: редактор строки символов, текстовый редактор, редактор символов пользователя. В качестве примеров будем использовать программы, с подробными пояснениями.
Программы приведены в следующем формате: в первом столбце записан адрес команды, во втором - представлено значение, записанное по этому адресу, или команда в машинных кодах, в третьем столбце та же команда, но в мнемонике ассемблера, а в четвертом - пояснения того, что происходит при выполнении данной команды.
Числа и коды в основном приведены в восьмеричной системе счисления. Числа, отмеченные индексом 10, даны в десятичной системе счисления. В десятичной системе приведены и те числа, написание которых не может быть истолковано иначе, например, 228, 99.
Ввод и редактирование графической и текстовой информации осуществляются, в основном, с помощью клавиатуры. У "Электроники БК-0010" встречаются две модификации клавиатуры: "малоходовая", применяющаяся на БК-0010, и "полноходовая" - на БК-0010.01. Каждая из них имеет как достоинства, так и недостатки.
Малоходовая клавиатура - это 92 кнопки ПН-11, распаянные на одной плате. На кнопки наложены квадратные полиэтиленовые колпачки, удерживающиеся с помощью металлической решетки, к которой прикручена плата с кнопками. Решетка с колпачками в свою очередь закрыта толстым полиэтиленом, на который наложен бумажный лист с изображением 86 клавиш. Полиэтилен удерживается лежащим сверху жестким листом прозрачного пластика.
Разница в числе кнопок и клавиш объясняется тем, что четыре из 92 кнопок предназначены для выдачи кода пробела, и по две кнопки - для выдачи кодов ВВОД, регистров РУС и ЛАТ.
Основной недостаток этой клавиатуры заключается в том, что на гладкой пластиковой поверхности пальцы не различают, где кончается одна клавиша и начинается другая, да и жесткость трехслойного "пирога" затрудняет работу на компьютере.
Эти недостатки устранимы: достаточно удалить с клавиатуры полиэтиленовую пленку, лист бумаги с изображением клавиатуры и жесткий пластик. С помощью липкой ленты можно нанести изображения клавиш непосредственно на полиэтиленовые колпачки, накладываемые на кнопки. Теперь можно работать "вслепую". Главное, однако, в том, что на передний план выдвинулись скрытые ранее достоинства малоходовой клавиатуры.
Основное достоинство в том, что можно быстро изменять изображения на клавишах. Для этого на листе бумаги рисуют новые изображения, используемые для какой-либо программы. Такие сменные листы удобны для овладения компьютерной грамотностью, игр для дошкольников и младших школьников, поскольку вместо стандартных надписей можно наклеить любую пиктограмму, например, изображения домов, гор, цветов и т.д.
Кроме того, кнопки ПН-11 надежно защищены от пыли и грязи, поэтому нельзя пожаловаться на надежность малоходовой клавиатуры. Еще одно достоинство в том, что на малоходовой клавиатуре на 12 клавиш больше, чем на полноходовой. То, что клавиши имеют малый ход, существенно упрощает задачу, если идет динамическая компьютерная игра.
У БК-0010.01 - клавиатура полноходовая. Внешне она напоминает традиционную компьютерную клавиатуру, однако не лишена недостатков. У только что приобретенного компьютера вскоре проявлялся "дребезг" клавиш. Причин тому много - одна из них в том, что контактные группы клавиш открыты, и на них накапливается грязь.
Большой ход клавиш неудобен при динамических играх, так как не позволяет быстро вводить информацию в компьютер. Со временем клавиши начинают "западать", изображения на них (кстати, менее информативные, чем у БК) довольно быстро стираются.
Пользователи однако нашли выход: под клавиши они подкладывают тонкий лист поролона, тем самым несколько уменьшают ход клавиш и устраняют их стук об основание; точки трения в клавишах смазывают графитовой смазкой; увеличивают параметры времязадающей цепочки клавиатуры; клавиши покрывают сверху лаком или гравируют на них необходимые изображения.
Независимо от того, какая именно клавиатура у вашего компьютера - нажатия на клавиши воспринимаются одинаково.
При каждом нажатии формируется соответствующий код символа, который в дальнейшем обрабатывается программой - драйвером клавиатуры.
Выбор символа и значение кода, генерируемого при нажатии клавиши, зависят от предшествующего состояния регистров клавиатуры, т.е. от того, какие регистры были установлены ранее.
По функциональному назначению клавиши можно разделить на четыре группы: регистровые, управляющие, алфавитно-цифровые и редактирующие.
К регистровым относятся:
Клавиши ЗАГЛ, СТР, НР (AP2), ПР (НР) и СУ при нажатии не вырабатывают код. Коды клавиш РУС - (17) и ЛАТ - (16) используются только драйвером клавиатуры и не передаются в рабочую программу. Однако при пересылке этих кодов в драйвер устройства отображения коды отображаются в виде инвертированных символов N и О латинского алфавита. Включение режима РУС(ЛАТ) индицируется в служебной строке.
Управляющие клавиши предназначены для формирования управляющих кодов и управления режимами работы микроЭВМ.
Алфавитно-цифровые клавиши позволяют вводить коды цифр, специальных символов, заглавных и строчных букв русского и латинского алфавитов, кодов полуграфики, некоторых управляющих кодов (переключения режимов работы дисплея), а также управлять программируемыми ключами.
Коды цифр вводятся при нажатии на цифровые клавиши.
Коды символов, расположенных на клавишах справа (у БК-0010.01 - внизу), вводят при установленном правом (нижнем) регистре.
Заглавные и строчные буквы русского и латинского алфавитов вводят при соответствующей комбинации регистров ЗАГЛ, СТР, РУС, ЛАТ.
Ввод кодов полуграфики, управляющих кодов и управление программируемыми ключами осуществляется при включенным нижнем регистре (регистре АР2 для БК-0010.01).
Редактирующие клавиши позволяют вводить коды символов, выполняющих функции редактирования информации.
Значения кодов символов микроЭВМ БК-0010 (БК-0010.01) приведены в литературе (кодировка КОИ-7), поэтому не будем на них останавливаться.
Клавиатура микроЭВМ БК-0010 позволяет формировать коды символов не только нажатием одной определенной клавиши, но и их комбинациями. В таблице 1 приведены комбинации клавиш, которые соответствуют управляющим символам.
Расшифруем обозначения граф в таблице:
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 | СУ/H | Перевод курсора влево | 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 | СУ/R | Исходная установка курсора | 22 | Исходи, установка курсора | ||
23 | ВС | СУ/S | Перевод курсора в начало текущей строки | 23 | Перемещение нижней от курсора части экрана вверх | |
24 | ГТ | СУ/T | Перевод курсора на 8 позиций вправо | 24 | Перемещение нижней от курсора части экрана вниз | |
25 | СУ/U | Перевод курсора в начало следующей строки | ||||
26 | СУ/V | Сдвижка в строке | 26 | Сдвижка в строке | ||
27 | СУ/W | Раздвижка в строке | 27 | Раздвижка в строке | ||
30 | СУ/Х | Удаление символа | 30 | Удаление символа | ||
31 | СУ/Y | Перемещение | 31 | Перемещение | ||
32 | СУ/Z | курсора | 32 | курсора | ||
33 | СУ/[ | на одну | 33 | на одну | ||
34 | СУ/\ | позицию | 34 | позицию | ||
35 | СУ/] | по стрелке | 35 | по стрелке | ||
36 | СУ/^ | 36 | ||||
37 | СУ/_ | 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 НР/ |
Синий | Инверт.р | 42 | Синий |
223 | НР/ПР/3 | НР/СУ/S НР/ВС |
Зеленый | Инверт.с | 43 | Зеленый |
224 | НР/ПР/4 | НР/СУ/T НР/ГТ |
Черный | Инверт.т | 44 | Черный |
225 | ГРАФ | НР/СУ/U НР/СУ/E НР/ПР/5 |
Инверт.Г | 5 | Графический режим | |
226 | ЗАП | НР/СУ/V НР/СУ/F НР/ПР/6 НР/ |
Ииверт.3 | 6 | Запись в графическом режиме | |
227 | СТИР | НР/СУ/W НР/СУ/О НР/ПР/7 НР/ |
Инверт.С | 7 | Стирание в графическом режиме | |
230 | НР/РЕД | НР/СУ/Х НР/СУ/Н НР/ПР/8 НР/ |
Редактирование | Инверт.ь | 30 | Управляющий код |
231 | СБР | НР/СУ/Y НР/СУ/К НР/ПР/9 НР/ |
Сброс части строки | Инверт.ы | 13 | Сброс части строки |
232 | НР/КУРСОР | НР/СУ/Z НР/ |
Переключение индикации курсора | Инверт.з | 72 | Переключение индикации курсора |
233 | НР/(32/64) | НР/СУ/[ НР/ |
Установка числа символов в строке | Инверт.ш | 73 | Установка числа символов в строке |
234 | НР/ИНВ.С | НР/СУ/\ НР/ |
Инверсия символов | Инверт.э | 54 | Инверсия символов |
235 | НР/ИНВ.Э | НР/СУ/] НР/ |
Инверсия экрана | Инверт.щ | 55 | Инверсия экрана |
236 | НР/УСТ.ИНД | НР/СУ/^ НР/ |
Установка индикации в служебной строке | Инверт.ч | 56 | Установка индикации в служебной строке |
237 | НР/ПОДЧ | НР/СУ/_ НР/ |
Подчеркивание символов | Инверт.ъ | 57 | Подчеркивание символов |
В табличных описаниях комбинаций клавиш владельцы БК-0010.01 должны заменить название регистра НР на АР2.
Некоторые коды (205-210) с клавиатуры сформировать нельзя, поэтому их обычно используют в качестве внутренних кодов программы, как это сделано, например, в интерпретаторе Фокала.
Значительная часть кодов (0-2 и т.д.) не обрабатывается драйвером устройства отображения (телевизора). Эти коды можно использовать для управления программами пользователя.
Клавиатурой управляет большая интегральная схема К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 как индикатор включения счетчика.
Драйвер клавиатуры позволяет приостановить исполнение рабочей программы - для этого достаточно ввести символ @ (регистр СУ). Выполнение рабочей программы продолжится при его повторном вводе или при вводе любого другого символа.
Коды, вырабатываемые при нажатии клавиш РУС, ЛАТ, УСТ.ТАБ, СБР.ТАБ, ТАБ, ПОВТ, необходимы только драйверу клавиатуры - в рабочую программу они не передаются.
При функционирующей рабочей программе возможно обращение к подпрограммам драйвера клавиатуры. Этому служит командное прерывание системных программ 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 при исполнении команды не сохраняется.
Результаты работы микроЭВМ выводятся на устройство отображения: если говорить о БК, то на телевизор (черно-белый или цветной). Формированием телесигнала занимается видеоконтроллер. Рассмотрим, как готовится информация, которой предстоит появиться на экране, уделяя внимание изменениям системных переменных.
Видеоконтроллер микроЭВМ построен на БИС К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 не имеет специальных средств для формирования изображения. Символы и графическую информацию формирует основной процессор и программа - драйвер телевизора.
Драйвер расположен в системном ПЗУ пускового монитора по адресам 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 и не использовать рулонный сдвиг информации.
Для управления драйвером служат девять команд системного прерывания 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 |
Достоинство этой подпрограммы и формата записи заключается в том, что строчка символов будет выдаваться всегда в одном месте и в одном режиме отображения, независимо от состояния ТВ-драйвера.
Итак, мы рассмотрели возможности обработки графо-текстовой информации, заложенные в ПЗУ микроЭВМ. Однако для создания эффективных программ эти возможности недостаточны. Повысить эффективность можно за счет программ-редакторов, записываемых в ОЗУ.
Кто хотя бы раз попытался использовать компьютер для обработки информации, будет стремиться расширить сферу его применения в повседневной жизни для решения как профессиональных, так и для бытовых вопросов.
В различных случаях требуются и различные редакторы. Поскольку объем ОЗУ БК-0010 сравнительно невелик (в 16д Кбайт памяти можно записать всего 7-10 страниц машинописного текста), для решения некоторых задач по переработке информации необходимы и специализированные редакторы, прежде всего потому, что универсальный редактор не может поместиться в памяти.
В настоящее время для БК-0010 созданы довольно неплохие редакторы: текстовый EDASP, графический ГРЕД, пакет программ графо-текстовой печати ГРАТЕП, а также система РИГА, обеспечивающая создание и редактирование как демонстрационных, так и игровых программ. Чаще всего эти разработки вполне могут удовлетворить пользователя, однако, создавая специфические программы, программист нередко нуждается в редакторе, отвечающем вполне определенным требованиям, которым не удовлетворяет ни одна из названных программ.
Ситуация не безвыходная, и чтобы научиться самостоятельно выходить из нее, рассмотрим примеры реализации некоторых редакторов - строки, кадра, символов или марок. Редакторы разработаны для игровых программ пакета МИР ПРИКЛЮЧЕНИИ, однако, их нетрудно адаптировать в соответствии со своими намерениями.
Редактирование строки символов необходимо, например, для определения или изменения клавиш управления программой. Считается, что в памяти машины отведены подряд несколько слов, в которых записаны коды, выдаваемые клавиатурой при нажатии клавиш, например, для перемещения изображения символа вправо, влево, вверх, вниз и т.д.
Для такого редактора можно было бы применить команду 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), в которых должна быть записана служебная текстовая информация. Эти массивы можно задать самостоятельно в соответствии с функциональным назначением кодов редактируемой строчки символов.
При обработке информационных массивов пользователю доступна вся информация, которую можно отобразить на экране телевизора.
Условимся называть кадром информационный массив, отображаемый на экране. Если речь идет о текстовом массиве, несложно подсчитать объем кадра. Поскольку на экране отображается 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, ТАРЗАН, ДЕСАНТНИК. Неясным остается одно - как же были сформированы массивы разложения символов?
Редакторы символов применяются в некоторых системных и игровых программах - системе РИГА, редакторе графо-текстовой печати ГРАТР, пакете игровых программ МИР приключений. Требования к редактору символов аналогичны тем, что предъявляют к редактору кадра.
При редактировании символа необходимо иметь возможность задавать или изменять один-два разряда в слове разложения символа. Это означает, что для редактирования необходимы коды, количество которых составляет два для черно-белого изображения и четыре для цветного.
Можно считать, что в слове разложения символа упаковано 20 или 10 кодов символов соответственно.
Массив разложения символа рассматривается аналогично кадру, записанному в массив хранения. Для редактирования массив разложения символа пересылается в буфер с разуплотнением.
При выводе изображения каждый разряд или два разряда отображаются в виде символа ЗАБОЙ, цвет которого определяется по правилу:
код символа | цвет символа ЗАБОЙ |
0 | черный |
1 | зеленый |
2 | синий |
3 | красный |
Редактирование разуплотненного массива разложения символа, который находится в буфере, осуществляется аналогично редактированию кадра алфавитной информации. При пересылке отредактированного массива на место для хранения производится его уплотнение.
В процессе работы программы символ может отображаться без разуплотнения массива или, напротив, разуплотнение может осуществляться с небольшим коэффициентом увеличения (в 2 или 4 раза), что позволяет выводить символы в два-четыре раза большего размера.
Наличие в программах как прикладных, так и игровых, разнообразных средств обработки графо-текстовой информации значительно повышает их эффективность.
Автор надеется, что это небольшое пособие поможет начинающим программистам обрабатывать графо-текстовую информацию, освоить имеющиеся программные инструменты и поможет созданию разнообразных программ.
В пособии не были рассмотрены графические редакторы, поскольку они практически не отличаются по своим возможностям от редакторов символов. Графические редакторы, как и редакторы символов оперируют с массивами хранения информации, которые пересылаются в экранную область ОЗУ для формирования изображения.
Цена 5 руб.
Ротапринт ВНИИЭСМ
Зак.369. Тир.10000. 1990.