                     -= UzVers Manual =-
______________________________________________________________
     GUI   является   историческим   продолжением   библиотеки
FastLib. В народе известны наши программы, использующие FL v3.
3x.  К  сожалению,  следующие  версии  (v4.  0  - вызовы через
RST#10,  система  вложенностей;  v3.  5x  - занимает страницу,
полностью  изменена  оболочка,  64  символа,  корявая  система
вложенностей)  распространения не получили в виду их неудачной
внутренней  организации  и недоделанности. Поэтому, ровно один
год  бывшие FG-members (у бывших DC-members'ов свои понятия об
интерфейсе:)  юзали  эту  флибу.  Ничего  так себе первый блин
получился,  мог  быть  и  хуже:)  Однако,  как  библиотеку  не
раздували,  сама концепция противилась этому всеми файлерами и
KFLAG'ами:)   Поэтому   на   Predator'а   вчера  нашло  что-то
(наверное,  ожидание  Конца  Света,  или  просто в августе мне
угарно  кодится:),  и  он  четырнадцать  часов подряд на одном
дыхании наклепал следующую _рабочую_ версию флибы. Пардон, уже
не  FLib,  а GUI. Может через пару месяцев выявятся недостатки
GUI, тогда через годик может и мультизадачную Dream-controlled
Coders Interface сбацаем:))) Ну да ладно,хватит лирики, хотя я
так ее люблю:) Перейдем к описанию процесса...

     Самое  главное  -  оконная  система. Теперь она полностью
переписана  и  представляет  из  себя pulldown-оболочку, т. е.
кнопочки со стрелочками. Стрелочка гоняется ото всех девайсов,
мыша  и  кемпстон  детектятся  автоматически. Как всегда, если
ширина  либо  высота  равны нулю, то происходит автоматическая
настройка на окно. Заголовок таков:

   +0,1 - xy
   +2,3 - ширина/высота (не включая рамки)
   +4,5 - цвет рамки/потрохов
   +6 - флаг:) бит 0 = 1  -  рамка  не  рисуется, текстура  не
                             кладется
               бит 1 = 1 - без атрибутов
               бит 2 = 1 - текст,кнопки,спрайты не выводятся
               бит 3 = 1 - если не попали на кнопку, то
                           возвращается макс.номер кнопки+1
               бит 4 = 1 - бит 3 не срабатывает, если стрелка
                           находится в пределах окна
               бит 5 = 1 - если зацепить левый верхний угол,то
                           окно могет сдвинуться с места
               бит 6  =  1  -  фон  под  окном  сохраняется  и
                           ресторится

   +7... nn - текст в окне
   +nn+1 - обязательно нолик (конец текста)

     Если  после  этого  стоит  #FF, то никаких вам кнопочек и
стрелочек,  а вот если #00, то это значит присутствует неявное
кол-во кнопок. Описатель кнопки:

   +0 - всегда ноль
   +1,2 - адрес образа кнопки
   +3,4 - xy кнопки в окне
   +5,6 - ширина/высота кнопки в знакомствах
   +7 - атрибуты кнопки
   +8 - флаг
       бит 0 = 1 - кнопка с фиксацией
       бит 1 = 1 - кнопка в положении "нажата"
       бит 2 = 1 - выводить/невыводить атрибуты (1/0 соотв.)
       бит 3 = 1 - кнопка-иконка,т.е. при нажатии не
                   опускается, но ее номер возвращается.
       бит 4 = 1 - отключить реакцию на нажатие кнопки

     Если  кнопочек  больше  не  надо,  то  ставите  #FF после
последнего описателя.

     Вместо  #FF  можно поставить #01, а потом код символа. Это
будет   "горячей"  клавишей.  В  программу  возвращается  номер
описателся   клавиши   (а   их,   как  вы  поняли,  может  быть
неограниченное количество)

     По  просьбе  трудящихся добавлена "подсветка". После блока
описателя  баттонов/ горячих клавиш можно поставить #02 и затем
5  байт:  x,  y  (в  окне),  ширина,  высота полоски подсветки.
Последним   параметром   идет,   как  можно  догадаться,  флаг.
Задействованы такие биты:

     bit 0 = 1 - опция не подсвечивается
     bit 1 = 1 - опция на огонь не реагирует
     
     По  нажатию  на  огонь  если  курсор  стоял на полоске, то
устанавливается   флаг  carry  и  в  рег.A  возвращается  номер
полоски.  Если  carry не установлен, то была нажата кнопка, а в
рег.A - ее номер.

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

     Теперь библа сидит в странице, работа с ней ведется через
резидент   длиной   360-400   (примерно)  байт.  Вызов  функий
происходит  через  него,  родимого.  При  этом  номер  функции
задается  в  рег. А, параметры передаются через альтернативный
рег.А. Например:

;смена клоподава
   LD C,#01      ;фанкшен тыр-доса "смена дисковода"
   LD A,#01      ;номер драйва
   EX AF,AF'     ;передаем через альтеранивный A
   LD A,DOS_FUNC ;номер группы функций GUI "работа с диском"
   CALL GUI      ;вызываем резидент

     При  вызове  резидента напрочь прибиваются BC', DE', HL',
при  возврате же из него ничего не прибивается. Т. е. выходные
параметры функции остаются целы.

     Для   удобства  юзания  все  доступные  функции  обозваны
именами. Так, за FILER'ом кроется код 0. Вызов может проходить
и из другой страницы, но перед этим надо задать номер страницы
для  возврата  в  переменной  S_PAGE резидента, а в GUI_PAGE -
номер страницы, где сидит собственно сам GUI. Не забывайте про
последнюю  переменную,  ее нужно устанавливать всегда. Данные,
необходимые  библиотеке (типа окна) все равно должны покоиться
в 48-й памяти. И не забывайте добавлять #10 к номеру страницы.

     Ах,да!   Для   сохранения   фона  используется  еще  одна
страничка. Ее номер надо задать в STORE_PAGE.

     Вроде   концепцию  прояснили,  перейдем  к  подробностям.
Переменные  сохранили  свои  значения  от v3. 3x (если вам это
что-то  говорит;), но кое-какие умерли, типа KFLAG. Добавилась
переменная  RAMDR  в  которой  задается  номер  рам-диска. Для
Кая-1024  здесь  будет 2,а для Tr- Dos 5. 12F и иже с нею - 3.
Сделано  это  из-за  турбо-драйвера.  Теперь  при  обращении к
рам-диску   _всегда_   будет  работать  голый  Tr-Dos.  Да  че
говорить, 1 мегабайт - рулез форева!


     Больше никак не вспоминается. Подольем пару ложек дегтя:

     - нельзя _впрямую_ загрузить/выгрузить страницу (надеюсь,
понятно  почему;). Необходимо использовать специальную функцию
SL_BANK.

     -   Paracel'овский   турбо-драйвер   работает  не  всегда
устойчиво,  иногда  "задумывается",  но вроде не сбрасывается.
Это  происходит  при  обращению к диску после смены дисковода,
если  диска  в  флоповерте  нет.  Фича  вот в чем: смена диска
осуществляется кустарным образом - сменой переменных,т. е. без
реального обращения к драйвам.

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

     -  окна  медленно  рисуются.  Да ну вас нахрен! Видели бы
вы, как они раньше прорисовывались...

     А  чтобы  не  совсем  хреновое  впечатление получилось:),
скажу вам,что в печаталке буковок есть макросы (!):

     - 16,x - ну это всем понятно,цвет меняет

     -  17,  n,  x,  y  -  печать  спрайта n по xy в окне (см.
описание керналя).

     - 23 - отцентровать строку (!)

     - 24 - прижать строку в правому краю (?)

     -  25  -  пропустить  знакоместо. Именно пропустить, а не
пробел впечатать.

     Печать  only  32 символа, т. к. в GUI основная информация
ложится на графику (кнопки,спрайты).

                       /*DT GUI v1.4*/
                   Описание функций керналя
______________________________________________________________

                            FILER

     Вызывается файлер. Координаты окна задаются в WINX, WINY,
цвета  -  в  RATTR, PATTR, однако менять координаты не советую
(э-э-э...  в  смысле  следите,  чтобы  за  пределы  экрана  не
выехали).  Перед  вызовом  необходимо  настроить (один раз): в
PAGE  задать  номер  текущей  страницы (не RAM-страницы!!!), в
PAGESIZE - размер страницы (макс. 19), ERR_EXIT - адрес выхода
по  ошибке, TAB_ADR - адрес таблицы для сортировки файлов (см.
ниже),  MODE  - 0 для турбо-драйвера, другое для доса, RAMDR -
номер  рам-  диска,по  обращению  к которому ВСЕГДА включается
дос.  Если при вызове файлера включить carry (SCF), то каталог
перечитываться не будет.

                  Формат таблицы сортировки.

     Сначала  идет  команда,  затем ее параметры. Команд может
быть неограниченное количество, в приципе. Команды:

   0 - конец таблицы,без параметров
   1 - сортировка по расширениям
   2 - по длине в секторах
   3 - по маске в 9 байт ("." - любой символ)

     Например:

   1,"Q","e",2,#1B,3,"boot....B",0

     означает,  что сначала выведутся все файлы с расширениями
Q,  затем  e,  далее  выведутся  файлы с длиной 27 секторов, а
самым   последним  выведется  boot  и  другие  бейсик-файлы, у
которых   первые   4  буквы  boot.  Естественно,  если  файл с
расширением Q равен 27 секторам,то он выведется два раза.

     При любой дисковой ошибке вылетит табличка. По нажатию на
О.К. операция повторяется, иначе выход по ERR_EXIT.

     После   выбора   файла   в   #5CDD  имеем  его  16-битный
дескриптор, бр-р-р... 16-байтовый описатель;)


                             FDOS

     Обращение к диску через обработчик ошибок.


                             WIN

     Вызов оконной системы.


                           GET_NUM

     Получить  десятичный  эквивалент числа. В рег. C задается
разрядность числа (0 - 0..255,1 - 0..65535,2 - 0..16777216), а
само  число передается в регистрах A, HL, A+HL соответственно.
Полученный стринг помещается по адресу в DE.


                             BEEP

     Издает звуковой сигнал а-ля Alasm :)


                           WAITKEY

     Ждет нажатия любой клавишы/батона крысы.


                            NOKEY

     Ждет опускания всех клавиш/батонов крысы.


                            DELAY

     Задержка в кадрах. Кол-во прерываний передается в рег.B.


                            GETARW

     Восстановить фон под стрелкой.


                            PUTARW

     Вывод стрелки на экран.


                           DOS_FUNC

     Обращение   к   функциям   Tr-Dos.   Вместо   CALL  #3D13
используйте эту функцию,т.к. при включенном турбо-драйвере все
выполняется  раза  в  два  с половиной быстрее.

     Если  стоит  turbo-драйвер,  и функция обращается к диску
(чтение/запись   файлов   или   секторов),   то   эти  функции
автоматически  эмулируются.  Смена  дисковода  происходит  без
обращения к оному,причем после этого корректно работает дос.

     Поиск  файла  нестандартный: в #5CDD - данные для поиска;
A=0  -  поиск  ведется  в  несортированном  каталоге,  иначе в
отсортированном;  B=количество  байт в описателе файла (#5CDD)
для  сравнения,  в  C  -  номер подфункции поиска (#0A, кто не
знает). Вместо любого символа в имени файла и расширении можно
подставить  #02,  тогда  этот  символ будет проигнорирован. На
такие данные, как trk/sec и т.п. код #02 не действует.


                            DIRSCN

     Сканирование клавиатуры (для стрелки).


                            MOUSDR

     Опрос мыши (для стрелки).


                            DEFHL

     Макрокоманда LD DE,(HL).


                            HLFHL

     Макрокоманда LD HL,(HL).


                             EDIT

     Редактирование  стринга.  В IX задается адрес дескриптора
окна,  в HL - адрес стринга в описателе окна, в DE - начальные
координаты курсора в окне,в B - максимальная длина строки-1, в
C  -  символ  для  стирания. Если после выхода ячейка 23560 не
равна 13, то произошел выход по EXT.MODE (отмена).

     Можно  топтать такие кнопки: Delete - back space, Graph -
delete,  Edit - switch, C. Lock - Lock Caps, Enter/Ext. Mode -
exit.

     Раскладка клавиатуры меняется путем замены таблиц RUS_TAB
и LAT_TAB для русского и аглицкого лангуага соответственно. По
умолчанию стоит "яверты".

                          MICE_CTRL

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

     Включив  не  выключишь.  Если  позарез надо отключить, то
ставьте у себя RET. Или правьте сорцы :)


                           PUT_SPR

     Вывести  в  окно спрайт. В A - номер спрайта, в DE - xy в
окне.  В  переменной  SPR_ADR предварительно должен быть задан
адрес блока спрайтов. Формат блока спрайтов:

   +0 - кол-во спрайтов

   +1,2 - смещение данных спрайта ¬
   +2,3 - ширина/высота           +
                         для каждого спрайта

     Далее идут сами спрайты. Сначала атрибуты, затем пиксели в
линейном формате.


                           XY_COORD

     Перевести  координаты  в  DE в адрес на экране (в области
пикселов).


                           XY_ATTR

     Тоже самое,но в области атрибутов.


                             DHL

     Стандартная  процедура  Down  HL. Переводит адрес в HL на
следующую  строчку.  Тормознее  в несколько раз, т. к. юзается
резидент. Но для не критичных к скорости операций годится.


                             UHL

     Тоже самое,но вверх.

                             TEST
                            INITMV
                             FIRM
                            MOVES

     Это все из SerzhSoft'овской мыши.

                            RAMKA

     Нарисовать  по  XOR'у рамку. В HL - x, y, в DE - ширина и
высота.  X+LEN  и  Y+HGT могут быть соответственно больше 31 и
23,оставшаяся часть рамки не рисуется.

                           CH_BYTE

     Изменить   байтовую   переменную.  В  HL  -  адрес  (имя)
переменной, в A - значение.

                           CH_WORD

     Изменить  двухбайтовую  переменную.  В HL - адрес, в DE -
значение.

                           SL_BANK

     Т.к.  GUI  сидит в страничке, напрямую загрузить/выгрузить
страничку  проблематично.  Сия  функция призвана исправить этот
баг.  Правда  делается  все по-извращенски: в HL задаем адрес в
48-й  памяти,  где будет организован swap-буфер. В IX - адрес в
странице,  куда  по  идее  должен грузиться файл, в B - длину в
секторах  (обязательно,  т.к. размер свопа берется отсюда), в C
- код TR-DOS-функции загрузки/выгрузки. Для функций #5, #6 в DE
задаем  trk/sec,  а  для #0B,#0E - длину файла. Ну а в A задаем
номер  нужной  странички.  Сначала  все (без вашего участия, оф
коз) свопится в банку из 48-й памяти, потом туда грузится файл,
и,  в  конце  концов,  все  опять  свопится  ;)  Громоздко,  но
работает;)

 