|
Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. Источник: Файл "VPO.DOC" с дискеты SOUZ-NEON_TO_VPO_.IMG из комплекта поставки ПО к Союз-Неон ПК 11/16
|
┌───────────────────────────────────────────────────────┐
│ │
│ П Е Р С О Н А Л Ь Н А Я Э В М П К - 1 1 / 1 6 │
│ │
│ встроенное программное обеспечение │
│ │
│ В П О │
│ │
└───────────────────────────────────────────────────────┘
27 сентября 1990
С о д е р ж а н и е
1. Введение _______________________________________________
2. Назначение и структура _________________________________
3. Диспетчер ВПО __________________________________________
3.1. Статическая таблица __________________________________
3.2. Векторные прерывания _________________________________
3.3. Дескриптор регистра __________________________________
3.4. Дескриптор процесса __________________________________
3.5. Семафоры _____________________________________________
3.6. Распределение памяти _________________________________
3.7. Запросы ВПО __________________________________________
3.8. Страница ввода/вывода ________________________________
3.9. Замечания ____________________________________________
4. Эмулятор клавиатуры и "индикатора"______________________
5. Оконная подсистема _____________________________________
5.1. Организация оконной подсистемы _______________________
5.2. Рекомендации по использованию ________________________
5.3. Запросы ______________________________________________
5.3.1. Работа с плоскостями _______________________________
5.3.2. Работа с видами ____________________________________
5.3.3. Работа с палитрами _________________________________
5.3.4. Работа с курсором __________________________________
5.3.5. Работа со шрифтами _________________________________
5.3.6. Знакоместный вывод _________________________________
5.3.7. Блочные пересылки __________________________________
6. Оконный менеджер _______________________________________
7. Текстовый дисплей ______________________________________
8. Графический дисплей ____________________________________
8.1. Работа с растрами ____________________________________
8.2. Установка параметров _________________________________
8.3. Графические примитивы ________________________________
8.4. Точные блочные пересылки _____________________________
9. Консоль-пульт __________________________________________
10. Эмулятор НГМД/НЖМД _____________________________________
11. Эмулятор RAM-диска _____________________________________
12. Эмулятор последоватeльного интерфейса __________________
13. Эмулятор манипулятора "мышь" ___________________________
14. Календарь/часы _________________________________________
15. Звукогенератор _________________________________________
16. Файловая подсистема ____________________________________
17. Калькулятор ____________________________________________
18. Утилиты и драйверы _____________________________________
1. Введение
Настоящее руководство позволяет ознакомиться со структурой и
принципами построения встроенного программного обеспечения (ВПО)
ПЭВМ ПК-11/16.
Кроме того, данный документ устанавливает правила
использования ВПО в пользовательских и прикладных программах.
2. Назначение и структура
ВПО представляет собой встроенное системное программное
обеспечение ПЭВМ и предназначена для расширения функций аппаратных
средств ПЭВМ.
Логически ВПО состоит из трёх частей: диспетчера, эмулято-
ров устройств и утилит. Диспетчер работает в режиме HALT ПРЦ.
Эмуляторы устройств работают в режиме USER. Утилиты выполняются
под управлением дисковой ОС типа RT-11 (ДОС).
Физически ВПО разделено на две части:
- резидентную (размещённую в системном ПЗУ);
- загружаемую с дискового носителя (под управлением ДОС).
Диспетчер выполняет управляющие функции ВПО. Основными
функциями диспетчера являются инициализация ПЭВМ и ВПО,
диспетчирование прерываний от устройств, передача управления между
процессами-эмуляторами, синхронизация выполнения процессов
эмуляторов на приоритетной основе, распределение памяти и т.п.
Эмуляторы - это самостоятельные программы, состоящие из
одного или более процессов.
Каждый процесс характеризуется "собственным" набором
регистров ПРЦ (R0..R5, SP, PC, PSW), и "собственным"
распределением (и отображением) виртуального пространства ПРЦ на
ОЗУ. Основной характеристикой процесса является приоритет -
16-разрядное целое число со знаком. Диспетчер ВПО распределяет ПРЦ
между процессами на строго приоритетной основе. ДОС является одним
из процессов с точки зрения диспетчера и имеет приоритет 0.
Вся информация о процессе хранится в дескрипторе процесса.
Если процесс обладает (сам захватил или ему выделили) собственной
памятью, то он имеет битовую карту памяти, адрес которой хранится
в дескрипторе процесса. В битовой карте отмечены все 4К блоки ОЗУ,
которые составляют собственность процесса. Битовая карта
представляет собой 128-байтовую таблицу, в которой каждому биту
соответствует 4К байтовый блок ОЗУ (всё ОЗУ - до 4096К байт или
1024 4К байтовых блоков). Если разряд в карте памяти содержит 0,
то соответствующий ему блок памяти принадлежит процессу, в
противном случае (содержит 1) - блок памяти не принадлежит
процессу.
Учёт всей памяти ПЭВМ ведётся с помощью системной битовой
карты памяти (аналогичной карте памяти процесса). В системной
карте с помощью 0 отмечены уже занятые блоки памяти (процессами,
БИОС, а также "дефектные" блоки), а с помощью 1 - свободные, т.е.
ещё никем не используемые.
Управление процессами осуществляется с помощью нескольких
очередей. Если процесс готов к выполнению (т.е. не находится в
состоянии ожидания), то его дескриптор находится в очереди
(процессов), упорядоченной по приоритету. Первый процесс в этой
очереди - "текущий" - является самым приоритетным: он и
выполняется в данный момент времени процессором. Диспетчер ВПО
передаст управление другому процессу только в том случае, если
текущий процесс перейдёт в состояние ожидания (таймера, прерывания
и т.п.), или сам процесс понизит себе приоритет, или в результате
события станет готовым к выполнению другой процесс, имеющий более
высокий приоритет по сравнению с текущим процессом.
События, которые могут происходить в системе:
- наступило прерывание от устройства;
- изменился приоритет процесса;
- наступило прерывание по обращению к эмулируемому регистру;
- истёк интервал ожидания по таймеру.
Имеется одна очередь, в которую попадают дескрипторы процессов
(т.е. сами процессы), которые приостановили себя на заданный
интервал времени. В этой очереди дескрипторы упорядочены в
соответствии с интервалом, который осталось ждать: первым в этой
очереди стоит процесс, которому осталось ждать меньше всех
остальных.
Если процесс приостановил себя в ожидании обращения к
регистру, который он эмулирует, то дескриптор процесса ни в какой
очереди не находится.
Если необходимо организовать собственные очереди для
процессов, то для этого рекомендуется воспользоваться механизмом
семафоров.
В состав ВПО входят следующие модули и эмуляторы:
LOADER - модуль инициализации и запуска эмуляторов, хранящихся
в ПЗУ; инициализация завершается созданием процесса,
запускающего (загружающего) ДОС; после завершения
работы превращается в фоновый процесс, работающий на
самом низком приоритете; при повторном получении
управления создаёт ещё один процесс операционной
системы и выполняет начальную загрузку ДОС с диска;
RESET - процесс обработки сигнала INIT (команда RESET);
KEYBOARD█ - эмулятор клавиатуры и "индикатора";
WD █ - оконная подсистема;
WM █ - оконный менеджер;
VT █ - эмулятор текстового дисплея VT100 с расширенными функ-
циями управления цветами и шрифтами;
GT █ - эмулятор растрового графического дисплея;
PUL - эмулятор консоли-пульта;
FDHD █ - эмулятор НГМД/НЖМД;
MDC █ - эмулятор "электронного" диска (RAM-диска);
DLC █ - эмулятор последовательного интерфейса;
DLVT - эмулятор внешней консоли (регистры 177560-177566, век-
тора 60-64) по последовательному интерфейсу (по
умолчанию "токовая петля", скорость обмена 9600 бод);
LPC - эмулятор принтера (со стандартными регистрами 177514,
177516 и вектором 200);
OSRT - процесс дисковой ОС типа RT-11;
MSC █ - эмулятор манипулятора типа "мышь" с возможностью аль-
тернативного использования клавиатуры;
CLK █ - эмулятор календаря и часов;
SNC █ - эмулятор трёхголосового звукогенератора;
FIL █ - процесс подсистемы для работы с файлами;
CALC █ - эмулятор калькулятора.
█ - имеется дополнительное описание.
При включении питания выполняется начальная инициализация
ПЭВМ. Далее производится тестирование ОЗУ. Процедура тестирования
ОЗУ занимает 10-15 секунд. В процессе тестирования на экране
монитора (верхний правый угол) высвечивается окно "индикатора"
(например):
┌────────── область индикации слу-
│ жебной информации
┌─────────┴────────┐ - режим клавиатуры
╔════════════════════════════════════════╗ - коды клавиш
║ ─┐ ┐──┐┌─┐┌ ┌ ┌─┐ ║ - номер текущей
║ ─┤┌─┤┌─┘│ │└─┤ ├─┤ ║ дорожки НГМД/НЖМД
║ ─┘└─┘└──└─┘ ┘ └─┘ ║
╚════════════════════════════════════════╝
└─┬─┘└───┬───┘
│ └────── ёмкость встроенного ОЗУ в К байт
│
└───────────── номер версии резидентного ВПО (3d)
Процесс тестирования (номер текущего Кбайта) высвечивается на
индикаторе. Если в процессе тестирования обнаружены неисправные
блоки памяти, то в системной карте эти блоки будут помечены как
недоступные. Общий объём исправной памяти в Кбайтах будет высвечен
в левой части индикатора.
В конце инициализации вся память очищается, а управление
передаётся модулю LOADER, который запускает следующие процессы
(находящиеся в системном ПЗУ):
RESET - процесс обработка сигнала INIT;
KEYBOARD - эмулятор клавиатуры и "индикатора";
FDHD - эмулятор НГМД/НЖМД;
WD - оконная подсистема;
VT - эмулятор дисплея типа VT-100;
а затем начинает загрузку ДОС.
Если в один из НГМД вставлена дискета, то с неё начнётся
загрузка ДОС. В противном случае - загрузка начнётся с НЖМД (по
умолчанию устройство HD1).
В процессе загрузки в правой части индикатора будет
высвечиваться "Fd-xx" или "Hd-xx", где "хх" - номер текущего
циллиндра, соответственно НГМД или НЖМД.
Если вторая попытка (т.е. загрузка с НЖДМ) оканчивается неудачей,
LOADER попеременно пытается загрузить ОС то с привода 0, то - с
привода 1 НГМД.
3. Диспетчер ВПО
Диспетчер размещается в системном ПЗУ ПЭВМ. Нормальное рас-
пределение адресного пространства режима HALT показано ниже.
Регистры эмулируемых устройств занимают первые 4К байт ОЗУ
(адреса 0000000-0007776). Следующие 4К байт отводятся для адресов
дескрипторов регистров эмуляторов. Другими словами каждому
16-разрядному регистру из области первых 4К байт соответствует
16-разрядное слово, называемое адресом дескриптора. Если адрес
равен 0,то соответствующий ему "регистр" отсутствует, т.е. не
обслуживается ни одним из эмуляторов.
┌─────┬──────── страницы БИОС для динамического
│ │ отображения (доступа) к ОЗУ
↓ ↓
0 ▀1 ▀ 2 ▀ 3 ▀ 4 ▀ 5 ▀ 6 ▀ 7 ▀─ страницы по 8 Кб
├──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼ адресное
╚═══════════╝ ╞═════╦═════├──┬──┤ пространство
ПЗУ ║ │ режима HALT 64К
╔═════════════════╝ │
┌────────║──────────────────────────┘
↓ ↓
├────╞════════════╡
├──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼──┬──┼_________ адреса ОЗУ до 4 Мб
══ ══ ╞════╦═════╡
↑ ↑ ║
║ ║ ╚═════════════════ таблица и область связи ВПО (16К)
║ ╚═════════════════════════ таблица адресов дескрипторов
║ эмулируемых регистров (4К)
╚═══════════════════════════ регистры эмуляторов (4К)
Если адрес в таблице ненулевой и находится в диапазоне 100000
- 137776, то он указывает на дескриптор регистра эмулятора. Если
адрес находится в диапазоне 000000-037776, то он является адресом
точки входа в программу обработки ВПО-запроса. Программы обработки
ВПО-запросов обычно находятся в ПЗУ и выполняются в режиме HALT с
запрещёнными прерываниями.
Дескрипторы регистров динамически создаются эмуляторами по
мере необходимости и размещаются в области связи ВПО.
Для таблиц и области связи ВПО отводится 16К байт.
Расположение этой области в памяти не является фиксированным и
зависит от наличия дефектных БИС ОЗУ. �5Вначале размещается таблица
фиксированной длины. Вся остальная область отводится для
динамического размещения различных управляющих структур ВПО
(дескрипторы процессов, дескрипторы регистров, семафоры и т.д., а
также некоторых объектов, размер которых может меняться для
различных конфигураций аппаратных средств).
Таблица и область связи ВПО имеет следующую структуру:
статическая динамическая часть HALT
таблица области связи ├───→ ←───┐ стек
┌─┬──────────────┬────────────────────────────────────────┤
└─┴──────────────┴────────────────────────────────────────┤ 16К
↑ ↑ │
└──────────────────────────────┘ │
HEAP HSTACK ───────────────┘
указатель начала свободной
части динамической области
Для каждой управляющей структуры ВПО в статической таблице
имеется указатель на начало списка свободных (для структуры
данного типа). Это позволяет повторно использовать структуры,
которые уже были использованы.
ПРИМЕЧАНИЕ. В таблицах, представленных ниже, с помощью "*"
обозначены байтовые поля. Файл P16.MAC содержит определения всех
констант, рассматриваемых ниже, а также макрокоманды для запросов
к ВПО и целый ряд других определений, которые могут оказаться
полезными для системного программиста.
С помощью "=" помечены константы, а с помощью "-" - адреса
ячеек памяти или смещения в управляющих структурах.
3.1. Статическая таблица
HEAP - указатель начала свободной части динамической области;
первоначально устанавливается за концом статической
таблицы;
MAPLEN - длина битовой карты памяти в байтах;
FREEREG - указатель на первый свободный дескриптор регистров
эмуляторов; если =0, то свободных дескрипторов нет;
FREEPR - указатель на первый свободный дескриптор процесса;
если =0, то свободных дескрипторов нет;
FREESEM - указатель на первый свободный семафор;
FREEMAP - указатель на первый свободный блок, предназначенный
для битовых карт использования ОЗУ процессами;
MEMUSE - указатель на битовую карту использования ОЗУ (один бит
в карте соответствует одному блоку ОЗУ 4К байт);
размер карты зависит от объёма ОЗУ (например, для ОЗУ
1М байт используется карта, длиной 32 байта);
RUNNING - указатель на дескриптор процесса, выполняющегося в
данный момент времени; указатель показывает не на
начало дескриптора выполняющегося процесса, а на поле
P.SP;
READYQUE - адрес очереди процессов, готовых к выполнению;
RDSUCC - указатель на первый процесс, готовый к выполнению;
RDPRED - указатель на последний процесс, готовый к выполнению;
TIMEQUE - адрес очереди процессов, ожидающих завершения времен-
ного интервала;
TMSUCC - указатель на первый ожидающий процесс;
TMPRED - указатель на последний ожидающий процесс;
TOP$$ - указатель допустимой верхней границы динамической
области памяти (граничное значение для HEAP);
VRQFLG - ячейка для хранения флагов:
- бит С.IRQ наличия запроса на векторное прерывание;
- бит С.HLT наличия запроса на HALT-прерывание;
SAV.R0 ┐
SAV.R1 │
SAV.R2 │
SAV.R3 │
SAV.R4 ├ ─ рабочие ячейки модуля пульта-отладчика;
SAV.R5 │
SAV.SP │
SAV.PC │
SAV.PS ┘
ВЕКТОРА ПРЕРЫВАНИЙ. Для каждого вектора отводится два слова:
первое содержит адрес дескриптора процесса, который будет
обрабатывать прерывание; второе слово содержит пользовательский
параметр. Значение параметра задаётся по запросу PROVEC при
захвате вектора. При наступлении прерывания значение параметра
возвращается процессу в R2 (после запроса WAITINT);
вектора синхронных прерываний:
V.CPUH - прерывание по инструкции процессора HALT;
V.TR4H - тайм-аут в режиме HALT;
V.BUT - прерывание по кнопке "СТОП" клавиатуры;
V.SUPR - прерывание по необслуживаемому вектору;
V.2TIO - двойной тайм-аут в режиме USER;
вектора асинхронных прерываний
(маска для запрета-разрешения прерывания, хранится в P.MASK
дескриптора процесса):
V.INIT - (М.INIT) сигнал INIT или инструкция RESET;
V.FLOP - (М.FLOP) запрос НГМД/НЖМД;
V.RCRD - (М.RCRD) готовность приёмника последовательного интер-
фейса;
V.TRRD - (М.TRRD) готовность передатчика последовательного ин-
терфейса;
V.KBD - (М.KBD) запрос от контроллера клавиатуры;
V.SCRN - (М.SCRN) начало обратного хода кадровой развёртки;
V.PRRD - (М.PRRD) готовность принтера;
V.SLOT - (М.SLOT) запрос от разъёма расширителя блока ввода-
вывода;
VECLEN = длина таблицы векторов в байтах;
дополнительные маски для P.MASK:
M.TIO = маска наличия требования тайм-аута в запросе WAITINT;
M.RUN = маска готовности процесса к выполнению (процесс нахо-
дится в очереди готовых к выполнению процессов);
M.VRQ = маска разрешения процессу обрабатывать векторные
прерывания;
M.HLT = маска разрешения прерывания процесса Пультом-консолью
при нажатии клавиши СТОП;
VRQTBL - таблица и список запросов на векторные прерывания (см.
ниже); первые два слова таблицы содержат начало списка
векторов, по которым запрошены прерывания; таблица
рассчитана на вектора в диапазоне от V.LOW до W.HIGH
(608-4748); каждому вектору отводится два слова
(ссылка на следующий; ссылка на предыдущий);
PDPTR - указатель на начало единого списка дескрипторов
процессов; порядковый номер дескриптора в этом списке
(нумерация с 1) определяет идентификационный номер
процецесса;
С.TIM0 - младшие разряды системного времени;
С.TIM1 - старшие разряды системного времени;
С.TFLG - флаг необходимости учёта процессорного времени (=0);
если флаг не 0, то учёт времени отключается; для учёта
времени используется последний канал (частота) звуко-
генератора;
HEAP$$ = конец области, занимаемой статической таблицей;
HSTACK = адрес начала стека режима HALT.
3.2. Векторные прерывания
В ПЭВМ отсутствуют векторные прерывания. Однако они
необходимы для правильной эмуляции "стандартных устройств", без
которых не может обойтись ДОС. Поэтому предусмотрены
соответствующие аппаратно-программные средства, позволяющие
эмулировать векторные прерывания. ВПО содержит специальную
таблицу-список, в которой хранится информация о всех векторных
прерываниях, "выставленных" эмуляторами. Эмулятор выставляет
"запрос на прерывание" специальным запросом ВПО - SETINT. Снятие
запроса на прерывание выполняется запросом RESINT.
Эмуляция векторных прерываний происходит только для одного
процесса. Этот единственный процесс должен содержать в слове
P.MASK своего дескриптора установленный в 1 разряда в соответствии
смаской V.VRQ. Этим единственным процессом является процесс
дисковой ОС.
3.3. Дескриптор регистра
Дескриптор эмулируемого регистра имеет следующую структуру:
┌─────────────┐
│ P.MASK │
├─────────────┤
│ P.COPY │
├──────┬──────┤
│R.STAT│R.RQST│
├──────┴──────┤
│ R.PROC │
├─────────────┤
│ R.STRT │
├─────────────┤
│ R.RESE │
└─────────────┘
R.MASK - маска разрядов для восстановления только читаемых
разрядов;
R.COPY - копия разрядов регистра, которые можно использовать
только для чтения;
R.RQST* - битовая комбинация, определяющая операцию, которая
была выполнена с регистром;
R.STAT* - битовая комбинация, определяющая правила работы с
регистром;
R.PROC - адрес дескриптора процесса, который будет эмулиро-
вать регистр;
- адрес подпрограммы, которая будет эмулировать регистр
в режиме HALT;
R.STRT - дополнительная информация; заполняется и используется
эмулятором;
R.RESE - заполняется эмулятором; данное слово копируется в
регистр при системном прерывании по вектору V.INIT;
если слово содержит -1, то копирование выполняться не
будет;
REGLEN = длина дескриптора регистра в байтах;
┌─┬─┬─┬─┬─┬─┬─┬─┐ R.RQST - формируется перед вызовом эмулятора
│7│6│5│4│3│2│1│0│
└─┴─┴─┴─┴─┴─┴─┴─┘
1 1 1 0 │ │ 0 0
│ └─────── = 1 - была запись в регистр
└───────── = 1 - было чтение регистра
┌─┬─┬─┬─┬─┬─┬─┬─┐ R.STAT - заполняется и модифицируется эмулятором
│7│6│5│4│3│2│1│0│
└─┴─┴─┴─┴─┴─┴─┴─┘
0 0 0 1 │ │ │ └─── = 1 - вызов подпрограммы в режиме HALT
│ │ │ = 0 - вызов процесса (эмулятора)
│ │ └───── = 1 - вызов при байтовой записи (резерв)
│ └─────── = 1 - вызов при записи в регистр
└───────── = 1 - вызов при чтении регистра
3.4. Дескриптор процесса
Дескриптор процесса имеет следующую структуру:
┌─────────────┐
│ P.SUCC │
├─────────────┤
│ P.PRED │
├─────────────┤
│ P.R0 │
├─────────────┤
│ P.R1 │
├─────────────┤
.........
├─────────────┤
│ P.R5 │
├─────────────┤
│ P.SP │
├─────────────┤
│ P.PC │
├─────────────┤
│ P.PS │
├─────────────┤
│ P.UR0 │
├─────────────┤
│ P.UR1 │
├─────────────┤
........
├─────────────┤
│ P.UR7 │
├─────────────┤
│ P.MASK │
├─────────────┤
│ P.CPRC │
├─────────────┤
│ P.TIM │
├─────────────┤
│ P.PRI │
├─────────────┤
│ P.MEM │
├─────────────┤
│ P.NAME │ 16. байт
├─────────────┤
│ P.TIM0 │
├─────────────┤
│ P.TIM1 │
├─────────────┤
│ P.DSUCC │
└─────────────┘
P.SUCC - указатель на следующий процесс в очередях;
P.PRED - указатель на предыдущий процесс в очередях;
P.R0 ┐
P.R1 │
P.R2 │
P.R3 │
P.R4 ├ - содержимое регистров ПРЦ;
P.R5 │
P.SP │
P.PC │
P.PS ┘
P.UR0 ┐
P.UR1 │
P.UR2 │
P.UR3 ├ - содержимое регистров диспетчера памяти;
P.UR4 │
P.UR5 │
P.UR6 │
P.UR7 ┘
P.MASK - младший байт содержит битовую маску для запрета
прерываний в процессе обработки прерывания; старший
байт содержит служебные разряды (см. маски выше);
P.CPRC - адрес дескриптора процесса, обратившегося к регистру;
P.TIM - интервал времени, на который процесс приостановился;
P.PRI - приоритет процесса;
P.MEM - адрес битовой карты памяти, занятой процессом; данная
ячейка содержит 0, если процесс не использует
дополнительной памяти;
P.NAME - символическое имя процесса в формате asciz (не более
16. символов); поле имеет длину 16. байт;
P.TIM0 - младшие разряды учёта использованного времени процес-
сора;
P.TIM1 - старшие разряды учёта времени;
P.DSUC - указатель на следующий дескриптор процесса в едином
списке дескрипторов;
PROLEN = длина дескриптора процесса в байтах.
3.5. Семафоры
Обмен данными между процессами осуществляется использованием
общих структур данных, размещающихся в оперативной памяти.
"Правильный" доступ к общим данным со стороны нескольких процессов
может осуществляться либо путём использования механизма
"семафоров", либо временным запретом прерываний. Однако
использование запрета прерываний может помешать правильной работе
других (более приоритетных) процессов, не использующих доступ к
общим данным. Кроме этого семафоры позволяют синхронизовать работу
нескольких процессов.
С семафором связано целое неотрицательное число (S.CNTR).
На это целое число можно воздействовать только с помощью следующих
операций:
INITSEM - создать и инициализировать семафор;
WAITSEM - ждать освобождения семафора;
SIGSEM - сигнализировать освобождение семафора;
RELSEM - отказаться от использования семафора.
Перед использованием необходимо выполнить инициализацию семафора
запросом INITSEM. При этом целое число получает своё начальное
значение. Запрос SIGSEM увеличивает на 1 значение целого числа.
Действие запроса WAITSEM сводится к уменьшению значения на 1 (если
результат будет неотрицательным).
Выполнение запроса WAITSEM может привести к приостановке
процесса (выполнившего этот запрос). Это произойдёт в том случае,
если перед запросом целое имело значение 0. В этом случае процесс
будет поставлен в очередь к указанному семафору. Очередь, в
которую попадает процесс и в которой может находиться несколько
процессов, упорядочена по приоритету процессов.
Выполнение запроса SIGSEM приводит к увеличению значения
целого числа на 1 только в том случае, если очередь к семафору
пуста. Если очередь не пуста, то из неё извлекается первый
(наиболее приоритетный) процесс и ставится в очередь процессов,
готовых к выполнению.
Семафор имеет следующую структуру:
┌─────────────┐
│ S.CNTR │
├─────────────┤
│ S.FRST │
├─────────────┤
│ S.SUCC │
├─────────────┤
│ S.PRED │
└─────────────┘
S.CNTR - счётчик семафора;
S.FRST - указатель на начало очереди процессов, ждущих данного
семафора;
S.SUCC - указатель на первый ждущий процесс;
S.PRED - указатель на последный ждущий процесс;
SEMLEN = длина семафора в байтах;
Последние два указателя семафора используются в качестве
фиктивного процесса, который всегда "стоит" в очереди. Это
необходимо для упрощения алгоритмов работы с очередями.
3.6. Распределение памяти
Распределение памяти ПЭВМ выполняется под управлением ВПО.
Учёт свободной и занятой памяти осуществляется с помощью битовых
карт. Битовая карта представляет собой непрерывную таблицу фикси-
рованной длины (в MAPLEN хранится длина таблицы в байтах для
данной конфигурации ОЗУ).
В ВПО имеется одна битовая карта учёта всей памяти. Указатель
на эту карту хранится в MEMUSE. В данной карте "1" отмечены
свободный блоки памяти, а "0" - занятые. Для каждого процесса
(если он использует дополнительно выделяемую память) динамически
создаётся собственная битовая карта. В поле P.MEM дескриптора
процесса содержится адрес его собственной битовой карты, в которой
"1" отмечены блоки памяти, занятые (используемые) данным
процессом.
В ВПО принята следующая стратегия распределения памяти.
Имеется запрос GET4K, который "захватывает" непрерывную
область памяти, начиная с младших адресов, порцией от 1 до 16
блоков по 4К. Этот запрос рекомендуется использовать, когда
требуются относительно небольшие объёмы памяти.
Имеется также запрос GKT8K, который "захватывает" непрерывную
область памяти, начиная со старших адресов. Размер захватываемой
памяти указывается в блоках по 8К байт.
Запросы FREMEM и FRE4K освобождает память, занятую процессом
(в запросе указывается начальный блок и количество освобождаемых
блоков по 8К и 4К, соответственно).
Условная схема выделения памяти показана ниже:
младшая старшая
область область
┌────┬────────────────────────────────────────────────┐
│ВПО │ │
└────┴────────────────────────────────────────────────┘
├───────→ ←────────┤
GET4K GET8K
4. Эмулятор клавиатуры и "индикатора"
В состав клавиатурного блока ПЭВМ входит собственно
клавиатура и программный эмулятор "индикатора". "Индикатор"
высвечивается в виде окошка в верхнем правом углу экрана (под
управлением оконной подсистемы).
Клавиатура имеет следующую структуру:
╔══╦══╦══╦══╦══╗ ╔═══╦═══╦═══╗ ╔═════╦═════╗
║К1║К2║К3║К4║К5║ ║ПОМ║УСТ║ИСП║ ║СБРОС║СТОП ║
╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝
╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗ ┌──┬──┬──┐
║АР│;│1│2│3│4│5│6│7│8│9│0│─│:│ ║ │+ │─ │, │
║ 2│+│!│"│#│$│%│&│'│(│)│ │═│*│ ←═╣║ │х │÷ │ │
╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣ ├──┼──┼──┤
║ │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║ │7 │8 │9 │
║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║ │ │ │ │
╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║ ├──┼──┼──┤
║ │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║ │4 │5 │6 │
║УПР │F│Y│W│A│P│R│O│L│D│V│\│>│ ║ │ │ │ │
╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣ ├──┼──┼──┤
║АЛ║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║ ║↓║ ║ │1 │2 │3 │
║ Ф║АФ│Q│^│S│M│I│T│X│B│@│<║ ║ ║ ║ │ │ │ │
╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║ ├──┼──┼──┤
║SHFT║ФИ│ │SH ║ ║ ║ ║ │0 │. │ВВ│
║ ║КС│ │ FT║ ║↑║ ║ │ │ │ОД│
╚════╩══╧═════════════╧═══╩══╩═╩══╝ └──┴──┴──┘
основная дополнительная
клавиатура клавиатура
После инициализации эмулятор клавиатуры переходит в
нормальный режим работы. В этом режиме вся информация о нажимаемых
клавишах передаются в регистры стандартной консольной клавиатуры:
KCSR (177560) ─ регистр состояния клавиатуры;
KBUF (177562) ─ буферный регистр клавиатуры;
KVEC ═ 60 ─ вектор прерывания от клавиатуры.
KCSR
╔═══════════════════════╦══╦══╦═════════════════╗
║15 14 13 12 11 10 9 8║ 7║ 6║ 5 4 3 2 1 0║
╚═══════════════════════╩══╩══╩═════════════════╝
│ │
│ └───── (R/W) 0 ─ прерывания запрещены
│ 1 ─ прерывания разрешены
│
└───── (R/O) 0 ─ KBUF пуст
1 ─ KBUF содержит информа─
цию о нажатой клавише
или комбинации
KBUF
╔════════════════════╦══╦═══════════════════════╗
║15 14 13 12 11 10 9║ 8║ 7 6 5 4 3 2 1 0║
╚════════════════════╩══╩═══════════════════════╝
│ └─────────┬───────────┘
│ └── байт, принятый с
│ клавиатуры
│
└─────────── 0 ─ "обычная" клавиша
1 ─ "управляющая" клавиша
Коды, генерируемые алфавитно─цифровыми клавишами (белого
цвета на основном поле клавиатуры), передаются в буферный регистр
(177562) с учетом модифицирующих клавиш и состояния клавиатуры
(см. таблицу). Алфавитно─цифровые клавиши белого цвета расположены
следующим образом:
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│;│1│2│3│4│5│6│7│8│9│0│─│:│
│+│!│"│#│$│%│&│'│(│)│ │═│*│
└┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┐
│Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│}│/│
│J│C│U│K│E│N│G│[│]│Z│H│_│?│
└┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┘
│Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│
│F│Y│W│A│P│R│O│L│D│V│\│>│
└┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴┬┴─┘
│Я│Ч│С│М│И│Т│Ъ│Б│>│,│
│Q│^│S│M│I│T│X│B│@│<│
└─┼─┴─┴─┴─┴─┴─┴─┼─┴─┘
│ │
└─────────────┘
Все остальные клавиши ─ управляющие клавиши (серого цвета и
дополнительное поле клавиатуры) и их комбинации (см. ниже):
─ генерируют отдельные коды в соответствии с таблицей, или
─ последовательности кодов (если их запрограммировать), или
─ активируют процесс (т.е. соответствующий код будет передан
в регистр, обслуживаемый этим процессом).
Таблица программируемых клавиш
┌───────┬───┬───────┬───┬───────┬───┬───────┬───┐
│клавиша│код│клавиша│код│клавиша│код│клавиша│код│
├───────┼───┼───────┼───┼───────┼───┼───────┼───┤
│ 0 │00 │ 8 │10 │ ПОМ │20 │ ТАБ │30 │
│ 1 │01 │ 9 │11 │ СБРОС │21 │ К1 │31 │
│ 2 │02 │ . │12 │ УСТ │22 │ К3 │32 │
│ 3 │03 │ + │13 │ ИСП │23 │ К2 │33 │
│ 4 │04 │ ─ │14 │ ↓ │24 │ К5 │34 │
│ 5 │05 │ , │15 │ → │25 │ К4 │35 │
│ 6 │06 │ ВВОД │16 │ ↑ │26 │ АР2 │36 │
│ 7 │07 │ ←┘ │17 │ ← │27 │ ←─┤ │37 │
└───────┴───┴───────┴───┴───────┴───┴───────┴───┘
Если нажимается одна программируемая клавиша, то ей соот─
ветствует код, представленный в таблице. Программируемые клавиши
могут нажиматься в комбинации с одной или несколькими
модифицирующими клавишами:
УПР (040)
SHIFT (100)
ФИКС (200)
Такой комбинации будет соответствовать суммарный код. Например,
одновременному нажатию клавиш УПР+ФИКС+АР2 соответствует код 276.
Фактически эмулятор клавиатуры передает в регистр слово (а не
байт). Младший байт слова содержит код символа. Старший байт слова
используется для передачи дополнительной информации: бит 0,
установленный в 1 индицирует нажатие управляющей клавиши или
комбинации.
Любой процесс может захватить клавиатуру. В этом режиме
(захвата) вся информация будет передаваться в регистр,
обслуживаемый этим процессом. При этом управляющие клавиши и
комбинации будут генерировать только соответствующие коды (а не
последовательности). Все остальное будет как и при нормальном
режиме работы клавиатуры.
Состояние клавиатуры и коды нажимаемых клавиш отображаются на
16─значном "индикаторе", высвечиваемым на экране в верхнем правом
углу. Коды символов высвечиваются в восьмеричном виде в правой
части индикатора. Следующие две позиции индикатора показывают
режим ввода букв кириллицы/латыни (L) и "фиксированного" ввода
"больших" или "малых" букв (с).
Клавиша "АЛФ" переключает режим ввода большихемалых букв по
умолчанию (аналогично Caps Lock). Ввод малых букв по умолчанию
отображается на индикаторе с помощью "с".
Клавиша "SHIFT", нажимаемая одновременно с клавишей символа
временно отменяет текущий режим ввода по умолчанию (т.е. если по
умолчанию вводятся большие буквы, то "SHIFT" позволяет вводить
малые буквы, и наоборот).
Одновременное нажатие "SHIFT" + "АЛФ" переключает режим ввода
латыньекириллица.
Клавиша "ГРАФ" и комбинация "SHIFT" + "ГРАФ" позволяют вво─
дить коды графических символов в соответствии с таблицей, пред─
ставленной ниже (приводятся 16─ричные и 8─ричные коды).
Имеются три системные утилиты, выполняющие программирование
клавиатуры (для работы в нормальном режиме):
─ KEY100.SAV ─ для работы дисплея типа VT─100;
─ KEY52.SAV ─ для работы дисплея типа VT─52;
─ KEY15.SAV ─ для работы дисплея типи 15─ИЭ─0013.
Эти же утилиты выполняют переключение "дисплея" в соответствующий
режим.
──────────┬─────────────────┬─────────────────┬────────────────
Клавиша │ Режим "латыни" │режим "кириллицы"│режим "графики"
├────────┬────────┼────────┼────────┼────────┬───────
│ код │+SHIFT │ код │+SHIFT │ код │+SHIFT
──────────┼────────┼────────┼────────┴────────┴────────┴───────
;+ │3B 073 │2B 053 │
1! │31 061 │21 041 │
2" │32 062 │22 042 │
3# │33 063 │23 043 │
4$ │34 064 │24 044 │ Данный ряд клавиш не зависит
5% │35 065 │25 045 │ ни от одного из режимов
6& │36 066 │26 046 │
7' │37 067 │27 047 │
8( │38 068 │28 050 │
9) │39 069 │29 051 │
0 │30 060 │30 060 │
-= │2D 055 │3D 075 │
:* │3A 072 │2A 052 │
──────────┼────────┼────────┼────────┬────────┬────────┬───────
ЙJ │4A 112 │6A 152 │D9 331 │B9 271 │89 211 │A9 251
ЦC │43 103 │63 143 │E6 346 │C6 306 │96 226 │F6 366
УU │55 125 │75 165 │E3 343 │C3 303 │93 223 │F3 363
КK │4B 113 │6B 153 │DA 332 │BA 272 │8A 212 │AA 252
ЕE │45 105 │65 145 │D5 325 │B5 265 │85 205 │A5 245
НN │4E 116 │6E 156 │DD 335 │BD 275 │8D 215 │AD 255
ГG │47 107 │67 147 │D3 323 │B3 263 │83 203 │A3 243
Ш[{ │7B 133 │5B 173 │E8 350 │C8 310 │98 230 │F8 370
Щ]} │7D 135 │5D 175 │E9 351 │C9 311 │99 231 │F9 371
ЗZ │5A 132 │7A 172 │D7 327 │B7 267 │87 207 │A7 247
ХH │48 110 │68 150 │E5 345 │C5 305 │95 225 │F5 365
Ъ_ │5F 137 │5F 177 │EA 352 │CA 312 │9A 232 │FA 372
/? │2F 057 │3F 077 │2F 057 │38 070 │2F 057 │38 070
──────────┼────────┼────────┼────────┼────────┼────────┼───────
ФF │46 106 │66 146 │E4 344 │C4 304 │94 224 │F4 364
ЫY │59 131 │79 171 │EB 353 │CB 313 │9B 233 │FB 373
ВW │57 127 │77 167 │D2 322 │B2 262 │82 202 │A2 242
АA │41 101 │61 141 │D0 320 │B0 260 │81 201 │A1 241
ПP │50 120 │70 160 │DF 337 │BF 277 │8F 217 │AF 257
РR │52 122 │72 162 │E0 340 │C0 300 │90 220 │F0 360
ОO │4F 117 │6F 157 │DE 336 │BE 276 │8E 216 │AE 256
ЛL │4C 114 │6C 154 │DB 333 │BB 273 │8B 213 │AB 253
ДD │44 104 │64 144 │D4 324 │B4 264 │84 204 │A4 244
ЖV │56 126 │76 166 │D6 326 │B6 266 │86 206 │A6 246
Э|\ │7C 134 │7C 174 │ED 355 │CD 315 │9D 235 │FD 375
.> │2E 056 │3E 076 │2E 056 │3E 076 │2E 056 │3E 076
──────────┼────────┼────────┼────────┼────────┼────────┼───────
ЯQ │51 121 │71 161 │EF 357 │CF 317 │9F 237 │FF 377
Ч_^ │5F 136 │5E 176 │E7 347 │C7 307 │97 227 │F7 367
СS │53 123 │73 163 │E1 341 │C1 301 │91 221 │F1 361
МM │4D 115 │6D 155 │DC 334 │BC 274 │8C 214 │AC 254
ИI │49 111 │69 151 │D8 330 │B8 270 │88 210 │A8 250
ТT │54 124 │74 164 │E2 342 │C2 302 │92 222 │B2 362
ЬX │58 130 │78 170 │EC 354 │CC 314 │9C 234 │FC 374
БB │42 102 │62 142 │D1 321 │B1 261 │80 200 │A0 240
Ю`@ │60 100 │40 140 │EE 356 │8E 316 │9E 236 │FE 376
,< │2C 054 │3C 074 │2C 054 │3C 074 │2C 054 │3C 074
Ниже представлены таблицы соответствия клавиатур различных
дисплеев клавиатуре ПЭВМ.
Соответствие клавиатуры ПЭВМ при эмуляции VT─100:
╔══╦══╦══╦══╦══╗ ╔═══╦═══╦═══╗ ╔═════╦═════╗
║К1║К2║К3║К4║К5║ ║PF2║PF3║PF4║ ║СБРОС║СТОП ║
╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝
╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗ ┌──┬──┬──┐
║ES│;│1│2│3│4│5│6│7│8│9│0│─│:│ ║ │PF│─ │, │
║C │+│!│"│#│$│%│&│'│(│)│ │═│*│ ←═╣║ │1 │÷ │ │
╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣ ├──┼──┼──┤
║ │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║ │7 │8 │9 │
║TAB│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║ │ │ │ │
╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║ ├──┼──┼──┤
║ │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║ │4 │5 │6 │
║CTRL│F│Y│W│A│P│R│O│L│D│V│\│>│ ║ │ │ │ │
╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣ ├──┼──┼──┤
║CA║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║ ║↓║ ║ │1 │2 │3 │
║PS║АФ│Q│^│S│M│I│T│X│B│@│<║ ║ ║ ║ │ │ │ │
╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║ ├──┼──┼──┤
║SHFT║ФИ│ │SH ║ ║ ║ ║ │0 │. │EN│
║ ║КС│ │ FT║ ║↑║ ║ │ │ │TR│
╚════╩══╧═════════════╧═══╩══╩═╩══╝ └──┴──┴──┘
основная дополнительная
клавиатура клавиатура
Соответствие клавиатуры ПЭВМ при эмуляции VT─52:
╔══╦══╦══╦══╦══╗ ╔═══╦═══╦═══╗ ╔═════╦═════╗
║К1║К2║К3║К4║К5║ ║ПОМ║УСТ║ИСП║ ║СБРОС║СТОП ║
╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝
╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗ ┌──┬──┬──┐
║ES│;│1│2│3│4│5│6│7│8│9│0│─│:│ ║ │PF│PF│PF│
║C │+│!│"│#│$│%│&│'│(│)│ │═│*│ ←═╣║ │1 │2 │3 │
╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣ ├──┼──┼──┤
║ │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║ │7 │8 │9 │
║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║ │ │ │ │
╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║ ├──┼──┼──┤
║ │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║ │4 │5 │6 │
║CTRL│F│Y│W│A│P│R│O│L│D│V│\│>│ ║ │ │ │ │
╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣ ├──┼──┼──┤
║CA║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║ ║↓║ ║ │1 │2 │3 │
║PS║АФ│Q│^│S│M│I│T│X│B│@│<║ ║ ║ ║ │ │ │ │
╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║ ├──┼──┼──┤
║SHFT║ФИ│ │SH ║ ║ ║ ║ │0 │. │EN│
║ ║КС│ │ FT║ ║↑║ ║ │ │ │TR│
╚════╩══╧═════════════╧═══╩══╩═╩══╝ └──┴──┴──┘
основная дополнительная
клавиатура клавиатура
Соответствие клавиатуры ПЭВМ при эмуляции 15─ИЭ─0013:
╔═══╦═══╦═══╗
║РУС║─↑ ║ЛАТ║ + SHIFT
╔══╦══╦══╦══╦══╗ ╠═══╬═══╬═══╣ ╔═════╦═════╗
║К1║К2║К3║К4║К5║ ║←─┤║ \ ║├─→║ ║СБРОС║СТОП ║
╚══╩══╩══╩══╩══╝ ╚═══╩═══╩═══╝ ╚═════╩═════╝
╔══╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤════╗ ┌──┬──┬──┐
║АР│;│1│2│3│4│5│6│7│8│9│0│─│:│ ║ │╤ │↑ │↓ │
║ 2│+│!│"│#│$│%│&│'│(│)│ │═│*│ ЗБ ║ │↑ │. │╧ │
╠══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤═══╣ ├──┼──┼──┤
║ │Й│Ц│У│К│Е│Н│Г│Ш│Щ│З│Х│Ъ│/│ ║ ║ │7 │8 │9 │
║ТАБ│J│C│U│K│E│N│G│[│]│Z│H│_│?│ ║ ║ │ │ │ │
╠═══╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╛ ║ ║ ├──┼──┼──┤
║ │Ф│Ы│В│А│П│Р│О│Л│Д│Ж│Э│.│←═╝ ║ │4 │5 │6 │
║ СУ │F│Y│W│A│P│R│O│L│D│V│\│>│ ║ │ │ │ │
╠══╦═╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╤╧╦╧═╦═╦══╣ ├──┼──┼──┤
║АЛ║ГР│Я│Ч│С│М│И│Т│Ъ│Б│>│,║ ║↓║ ║ │1 │2 │3 │
║ Ф║АФ│Q│^│S│M│I│T│X│B│@│<║ ║ ║ ║ │ │ │ │
╠══╩═╦╧═╪═╧═╧═╧═╧═╧═╧═╪═╧═╣← ╠═╣→ ║ ├──┼──┼──┤
║SHFT║ФИ│ │SH ║ ║ ║ ║ │0 │. │ ││
║ ║КС│ │ FT║ ║↑║ ║ │ │ │←┘│
╚════╩══╧═════════════╧═══╩══╩═╩══╝ └──┴──┴──┘
основная дополнительная
клавиатура клавиатура
Управление эмулятором клавиатуры и индикатором выполняется с
помощью следующих запросов (соответствующие определения и
макрокоманды имеются в файле P16.MAC):
┌───────┐
│RESPON │ ─ определяет последовательность кодов, "выдаваемую" кла─
└───────┘ виатурой; данный запрос может использоваться,
например, эмулятором дисплея для передачи управляющих
последовательностей в ответ на запросы к дисплею; при
этом всегда последовательность кодов будет выдаваться
через регистры консоли (177560, 177562);
вызов:
adr ─ адрес строки кодов, завершающейся байтом с кодом
0;
mov adr, @#RESPON
макрос:
RESPON adr
выход:
нет;
┌───────┐
│KSTRIN │
└───────┘
(1) ─ определяет последовательность кодов, выдаваемую клави─
атурой при нажатии управляющей клавиши (или комбинации
клавиш);
вызов:
adr ─ адрес таблицы; 1─ый байт таблицы содержит код
клавиши (или комбинации клавиш) и может быть в
диапазоне 0..255; далее следует последователь─
ность кодов, завершающаяся байтом с кодом 0;
или(2) ─ выполняет "привязку" управляющей клавиши (комбинации)
к регистру; регистр должен обслуживаться эмулятором; в
регистр будет заносится код клавиши (комбинации)
всякий раз при их нажимании; повторный запрос на "при─
вязку", в котором старший разряд адреса регистра равен
0, приведет к "захвату" всей клавиатуры; при этом все
управляющие клавиши (за исключением привязанных к
регистрам) будут передаваться эмулятору, выдавшему
данный запрос; отмена "захвата" клавиатуры выполняется
по запросу, имеющему первоначальный вид (т.е. старший
разряд адреса регистра равен 1); отмена "захвата"
клавиатуры одним процессом приведет к возврату
клавиатуры в "собственность" процессу, "обладавшему"
клавиатурой перед этим; таким образом при "захватах"
клавиатуры используется стековый механизм; процесс,
захвативший клавиатуру может пересылать в регистр
консоли 177562 коды любых символов, т.е. имитировать
нажатие клавиш, выполнять перекодировку и т.д.
вызов:
adr ─ адрес таблицы; 1─ый байт таблицы содержит код
клавиши (или комбинации клавиш) и может быть в
диапазоне 0..255; 2─ой байт содержит 0; в
следующем слове должен находится адрес регистра;
как отмечалось выше, старший разряд адреса
регистра влияет на "захват" клавиатуры (0 ─
захватить, 1 ─ освободить);
mov adr, @#KSTRIN
макрос:
KSTRIN adr
выход:
С═0 ─ запрос выполнен нормально;
С═1 ─ нет памяти для запоминания строки (последователь─
ности);
┌───────┐
│DCHAR │ ─ выводит байт на индикатор в указанную позицию;
└───────┘
байт управления индикатором
B
A = 010 E = 040 ───
B = 100 F = 020 A │ G │ C
C = 200 G = 002 ───
D = 001 H = 004 F │ E │ D H
─── ▀
вызов:
pos ─ номер позиции индикатора (0..15, позиция 0 ─
самая правая);
cod ─ выводимый код;
mov #<pos*400+cod>, @#DCHAR
макрос:
DCHAR #<pos*400+cod>
выход:
нет;
┌───────┐
│DSTRIN │ ─ выводит несколько байт на индикатор;
└───────┘
вызов:
adr ─ адрес таблицы (должен быть четный);
pos ─ номер позиции для 1─го (правого) байта; всего
имеется 16 позиций (нумерация от 0, справа ─
налево);
n ─ число выводимых байтов;
adr: .byte n*16.+pos ; номер позиции и число байтов
.blkb n ; выводимые байты
mov #adr, @#DSTRIN
макрос:
DSTRIN #adr
выход:
нет;
┌───────┐
│DVAL │ ─ выводит число в заданной системе счисления на
└───────┘ индикатор в заданную позицию;
вызов:
adr ─ адрес двусловной таблицы;
val ─ выводимое число;
pos ─ номер позиции для младшей цифры;
n ─ число выводимых цифр;
rad ─ основание системы счисления (1..16);
adr: .word val
.byte n*16.+pos
.byte rad
mov #adr, @#DVAL
макрос:
DVAL #adr
выход:
нет.