﻿ Barmaley Window Interface (BMW)
 Version 2 From 27 Jun 1996

Для работы требуются REL-модули:
EDZNAK - ZNAK, знакогенератор
SPKEYB - CONIN, драйвер клав.
DMM    - MALLOC,DISPOS - менеджер
	 динамической памяти

Программа, использующая BMW, должна:
 - предоставить метку SYSERR, это точка
   выхода через фатальную системную
   ошибку. При вызове SYSERR BMW в A
   помещает номер сообщения, а в HL -
   адрес таблицы сообщений.
 - каждое прерывание вызывать INTCUR для
   работы мигающего курсора.
 - каждое прерывание вызывать INTKEY из
   модуля SPKEYB, для опроса клавиатуры.
 - при вызове функций работы с окнами,
   DMM должен быть проинициализирован и
   (при изображении окна) иметь свобод-
   ное место на куче.

Задание параметров BMW через EQU:
MAXWIND - макс. число одновр. открытых
	  окон, под каждое лишнее окно
	  выделяется 4 байта DSEG.
MAXPARS - макс. число параметров команд
	  PRINTC. Изменять потребуется
	  толко при добавлении к PRINTC
	  новых команд, требующих боль-
	  ше, чем 2-х параметров.

Функции BMW:
PRINTW - открытие окна. <HL=адрес опи-
   сателя.

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

PRINTS - печать сообщения в окно.
   <HL=адрес сообщения, 0 - призн.конца.
   При печати обращается к PRINTC.
   Отрабатывает код #01 - центровка ст-
   роки от этого кода до первой встречи
   кода <#20. После этого печать сооб-
   щения продолжается со следующей по-
   зиции после центровки, с кода, обоз-
   начившего конец центрируемой строки.
   В сообщении возможны команды PRINTC,
   с параметрами, в том числе нулевыми и
   единичными, всё будет правильно.

PRINTC - печать символа в окно.
   Печать выполняется в позицию, задан-
   ную в описателе окна - PRCX, PRCY.
   Эти координаты отсчитываются от ле-
   вого верхнего края окна, с учётом
   флага рамки описателя окна.
   PRINTC обрабатывает упр. коды:
   13 - переход на следующую строку;
   8  - курсор влево;
   24 - курсор вправо;
   25 - курсор вверх;
   26 - курсор вниз;
   22,X,Y - установка координат печати.
     X измеряется в ширине знака PRINTC;
   21,X,Y - установка координат печати.
     X измеряется в знакоместах экрана;
   23,C - установка атрибутов печати.
     Имеет значение только 7-й бит -
     инверсия знаков;
   2  - включение мигающего курсора;
   3  - выключение курсора;
   4,L,H - печать двухбайтного числа
     (HEX). H,L - его адрес;
   5,L,H - печать строки (PRINTS) с
     адреса H,L;
   6,L,H - печать однобайтного числа
     (HEX). H,L - адрес числа;
   31 - очистка окна, с учетом флага
     рамки описателя окна.

SOBN   - печать N-ного сообщения из таб-
   лицы (через PRINTS). <HL=адрес табли-
   цы, <A=номер сообщения (0..N). Сооб-
   щения в таблице не должны содержать
   команд PRINTC с нулевыми параметрами.

GOTODE - Позиционирование курсора через
   вызов PRINTC(22,E,D).

A_HEX  - Печать A в 16-ричном виде.
HL_HEX - Печать HL в 16-ричном виде.

PREOB  - Интерпретация строки с адреса
   DE как 16-ричного двухбайтного числа.
   >HL=это число. Признаком конца числа
   считается символ, не являющийся
   16-ричной цифрой.

BOERP  - Преобразование 16-ричного числа
   в его символьное представление, кото-
   рое помещается в буфер с адреса DE.
   HL - преобразовываемое число.

OUTNS  - Печать N символов с адреса HL.
   <B=число символов.

IAWIND - Запомнить число открытых окон.

ABWIND - Закрыть все окна, которые были
   открыты после вызова IAWIND.

SCRL_UP - Скролл вверх прямоугольника,
   находящегося внутри окна и имеющего
   относительные координаты:
   L,H - его левый верхний угол (X,Y);
   E,D - его размеры в позициях 8x8.

SCRL_DN - Скролл вниз прямоугольника.
   Параметры аналогичны SCRL_UP.

INP_STR - ввод и редактирование строки
   с адреса HL, в текущих позициях печа-
   ти. При вызове строка печатается в
   текущей позиции. Первая нажатая кла-
   виша обрабатывается следующим обра-
   зом:
   - если она не вызывает выхода из
     INP_STR и
   - если она не является клавишей пере-
     мещения курсора, то
   содержимое буфера будет очищено, а
   клавиша - обработана обычным образом.
   INP_STR позволяет редактировать стро-
   ку клавишами Left, Right и Delete.
   Клавиши Tab, Up, Down, Enter, Esc вы-
   зывают выход из INP_STR.
   Все прочие управляющие клавиши игно-
   рируются.
   Первый байт буфера редактирования оп-
   ределяет его длину, а дальше идёт со-
   бственно буфер.

EDWORD - Редактирование 16-ричного чис-
   ла, в позиции E,D. Обращается к
   INP_STR, PREOB и BOERP. <HL - адрес
   памяти, где расположено редактируемое
   число. После редактирования результат
   будет туда записан.

CUR_ON  - Включает мигание курсора.

CUR_OFF - Выключает курсор.
   
SOUND0,
SOUND1,
SOUND2 - звуковые эффекты на динамик.

IMENU - Инициализация меню. <IX=адрес
   описателя меню. Перепечатывает стро-
   ковые элементы меню и устанавливает
   цвета.

RMENU - Запуск меню. Вызывается только
   после IMENU. Работа меню определяется
   его описателем. При нажатии ENTER на
   элементе меню он слегка помигает, а
   потом будет вызвана соотв. подпрог-
   рамма. RMENU также обрабатывает на-
   жатия стрелок. Все прочие клавиши вы-
   зывают возврат из RMENU, как впрочем
   и Enter. Но при выходе, если ZF=0, то
   в A - код клавиши, из-за которой был
   произведён выход; если ZF=1, значит
   была нажата Enter, и отработала со-
   отв. подпрограмма.

ILISTB - Инициализация ListBox. <IX=ад-
   рес описателя ListBox. Делает только
   то, что устанавливает нулевой элемент
   ListBox текущим, и перерисовывает
   ListBox.

RLISTB - Запуск ListBox. <IX=адрес опи-
   сателя ListBox. Можно в принципе вы-
   зывать и без ILISTB. Обрабатывает на-
   жатия только Up, Down, PgUp и PgDn.
   Все остальные клавиши вызывают воз-
   врат.

Структура описателя окна:
+00 X,Y - координаты окна на экране в
   позициях 8x8;
+02 LX,LY - размеры окна в позициях 8x8;
+04 A - цветовой атрибут окна;
+05 WF - флаги окна:
     b0 - "рамка" (1-активно);
     b1 - "сохранение" (0-активно);
     b2 - "тень" (1-активно);
+06 PRCX,PRCY - текущие координаты
    печати PRINTC, при вызове PRINTW
    обнуляются;
+08 TA - текущий атрибут печати (см.
    PRINTC(23,A));
+09 - строка заголовка окна. Если здесь
    записан 0, то заголовка нет. Если 1,
    то все дальнейшие символы (до 0)
    будут напечатаны в инверсном виде в
    верхней строке окна. Для центровки
    этот байт должен быть равен 1.

Структура описателя меню:
+00 - рабочая ячейка, ставьте туда 0;

+01 - Menu Item #00;
+17 - Menu Item #01;
...
+n*16+1 - #FF - признак конца.
n - число элементов меню.

Структура элемента меню (Menu Item):
+00 X,Y,L,A - координаты (8x8), длина
   в (8x8), цвет элемента меню;
+04 STR_AD - адрес строки, которая
   будет напечатана на месте элемента
   меню при вызове IMENU;
+06 LEFT_AD
+08 RIGHT_AD
+10 UP_AD
+12 DOWN_AD - действия RMENU при нажа-
   тии стрелок. Если тут записан адрес,
   то при нажатии стрелки будет вызвана
   подпрограмма. Если старший байт этого
   адреса равен 0, то он считается номе-
   ром элемента, который станет текущим
   при нажатии данной стрелки.
+14 ENTER_PROC - адрес подпрограммы, вы-
   зываемой при нажатии Enter на данном
   элементе меню.

Структура описателя ListBox:
+00 X,Y - коорд. ListBox в окне;
+02 LX,LY - размеры ListBox;
+04 MAX - число элементов ListBox;
+05 CUR - текущий элемент ListBox;
+06 FRAM - верхний элемент кадра;
+07 REL - номер текущего элемента
   относительно FRAM;
+08 GETSTR - адрес подпрограммы печа-
   ти элемента. При вызове в рег. C
   помещается номер элемента.

═══════════════════════════════════════
   Кое-какие сведения о конструкции BMW

   Все подпрограммы BMW, которые так или
иначе связаны с окнами - всевозможный
символьный вывод, скролл и пр. - пост-
роены так, что во время их работы ре-
гистр IY всё время указывает на описа-
тель текущего окна. Это, естественно,
не давало бы программе, использующей BMW
работать с регистром IY со всей вольно-
стью, если бы эта проблема не была реше-
на. Все процедуры BMW, работающие с ок-
нами, не портят индексных регистров по-
льзователя (если это не указано особо).
   Каждая подпрограмма-ENTRY первым де-
лом вызывает WIN_STO, которая сохраняет
индексные регистры, помещает в IY адрес
описателя текущего окна и обеспечивает
восстановление IX и IY после возврата из
процедуры-ENTRY.
   Если вызванная подпрограмма обращает-
ся к другой подпрограмме-ENTRY (как нап-
ример, PRINTS к PRINTC), то она вызыва-
ет подпрограмму с точки после вызова
WIN_STO. Ведь индексные регистры уже со-
хранены, зачем их сохранять ещё раз ?
Такие точки после вызова WIN_STO, имеют
имена с суффиксом "_S" - для внутреннего
использования. При добавлении новых фун-
кций в BMW необходимо придерживаться
этих традиций.

   Макрос VCALL IRG,OFFS. Вызывает под-
программу, адрес которой расположен в
IRG+OFFS   - L,
IRG+OFFS+1 - H, где IRG - индексный ре-
гистр, а OFFS - смещение.
####################################################################################################
