; Кернель функций BGE
;---------------------------------------------------------------
;        Описание кернеля Burial Graphics Editor 4.0
;---------------------------------------------------------------
; Модуль располагается с адреса PgnAdr (#A500) и
; может иметь максимальную длину #1B00 (6912) байт
; Plug-in is placed at PgnAdr (#A500), max size=#1B00 (6912)
;----------------------------------------------------------------------------------------------------
; На входе в плагин (at plug-in entry):   / Исправлено ! Изначально неверно указывалось HL и DE  / DA
; HL - адрес выхода из модуля (address or plug-in exit):
;      SCF - модуль не оставлять (модуль с ошибкой и т.п.) (don't keep the plug-in - error etc)
;      A = 0 перерисовывать главное меню и экран (redraw the Main menu and screen)
;      A = 1 закрыть все окна и выйти в главное меню (close all the windows and go to Main menu)
;-----------------------------------------------------------------------------------------------------

; Константы (constants) BGE
;
BeginGUI EQU #C800
SCREEN   EQU #C000
UNDOSCR  EQU #C000+6912      ; Undo address
ScrPage  EQU 0           ; страница SCREE, UNDOSCR (page for SCREE, UNDOSCR)
SuxPage  EQU 1           ; страница, куда свапятся окна и
                 ; которую можно использовать в
                 ; своих корыстных целях (windows swap page, you can use it)
GUIPage  EQU 3           ; страница SupremeGUI (SupremeGUI page)
AddPage  EQU 4           ; страница данных BGE, которую
                 ; так же можно использовать в
                 ; своих модулях, но не забывайте
                 ; о том, что эта страница
                 ; может использоваться и другими
                 ; модулями (datapage common for all the plug-ins, you can use it)
PgnPage1 EQU 6
PgnPage2 EQU 7
RamPage  EQU 7           ; страница второго экрана (screen 2 page)
PgnAdr   EQU #A500       ; адрес рабочего плагина (current plug-in address)
;---------------------------------------------------------------
; Вызов функций Burial, которые приведены ниже,
; происходит следующим образом:
;   CALL "адрес_в_кернеле"
; All the functions of BGE described below are called this way:
;   CALL "address_in_kernel"
;---------------------------------------------------------------
; ---- functions in BGE v3.o5 original ----

KERNEL      EQU #6000

; Вызвать функцию GUI (call GUI function)
GUI     EQU KERNEL

; Запуститьь BGE сначала (restart BGE)
BGE_RUN     EQU GUI+3

; Картинку на экран (picture to screen)
LOADSCR     EQU BGE_RUN+3

; С экрана в память (screen to memory)
SAVESCR     EQU LOADSCR+3

; Обменять с Undo (exchange with Undo)
LD_UNDO     EQU SAVESCR+3

; Сохранить в Undo (copy to Undo)
SV_UNDO     EQU LD_UNDO+3

; Нарисовать рамочку x8 (draw x8 frame)
; IX - адрес данных для построения рамки (data for frame)
; DB x,y,длина (width), высота (height)
; Ноль в длине и высоте означает 256... (zero size means 256)
BoxCol      EQU SV_UNDO+3

; Нарисовать рамочку x1 (draw x1 frame)
; IX - адрес данных для построения рамки (data for frame)
; DB x,y,длина (width), высота (height)
; Ноль в длине и высоте означает длину, высоту = единице (1) (zero size means 1)
BoxPix      EQU BoxCol+3

; Выбрать окно x8 (select window x8)
; Параметры аналогичны BoxCol (parameters as in BoxCol)
; После нажатия на Cancel, устанавливается флаг переноса
; и возвращаются старые параметры в [IX]
; (Cancel sets CY and returns the old parameters in [IX])
R8Sel       EQU BoxPix+3

; Выбрать окно x1 (select window x1)
; Параметры аналогичны BoxPix (parameters as in BoxPix)
; После нажатия на Cancel, устанавливается флаг переноса
; и возвращаются старые параметры в [IX]
; (Cancel sets CY and returns the old parameters in [IX])
R1Sel       EQU R8Sel+3

; Открыть страницу, с ее запоминанием для работы с GUI
;(open a page and remember it to work with GUI)
RAM     EQU R1Sel+3

; Сохранить окно [IX] с сохранением адреса окна в дескрипторе
; сохраненных окон
;(save window [IX] with saving window address in the descriptor of saved windows)
GETBLK      EQU RAM+3

; Закрыть последнее окно, которое указано в дескрипторе
; окон
;(close the last window listed in the descriptor of saved windows)
CLOSE       EQU GETBLK+3

; A  <- номер элемента (item number)
; BC <- адрес таблицы слов (address of word table) (DEFW)
; HL -> значение из таблицы (value from table)
TAB_HL      EQU CLOSE+3

; Вызывается TAB_HL, а затем делается JP (HL)
;(calls TAB_HL then does JP (HL))
TAB_JP      EQU TAB_HL+3

; Вызвать редактор имени файла (call filename editor)
; HL <- адрес буфера, где расположено имя файла (11 символов)
; на выходе в этом же буфере отредактированное имя, если не
; было нажата клавиша Ext.Mode, иначае установлен флаг
; переноса
; Имя файла так же копируется в 23773
FNEdit      EQU TAB_JP+3

; Вызвать файлер (call file selector)
; HL <- адрес таблицы сортировки файлов
; Вариации таблиц:
;
; DB #00,сектор_1, сектор_2, ..., #FF
; файлы размером сектор_1, сектор_2, ...
;
; DB #01,"p..","ex.","txt","...", ..., #FF
; файлы с вышеперечисленными расширениями, "." - любой символ
;
; DB #02,"имя.....scr",#FF
; файл с именем "имя......scr", "." - любой символ
FilerE      EQU FNEdit+3

; Опросить клавиши на событие OnFire и OnCancel
; (Check keys for OnFire and OnCancel)
; A -> замикшированные состояния:
;    bit 0 - нажат Fire
;    bit 1 - нажат Cancel
;    bit 2 - нажата на мыше (pressed on mouse)
; F ->   установленный флаг переноса (CY=1) - Cancel
BREAK       EQU FilerE+3

; Настроить таблицу для рисование точкой (install plot table)
; HL <- адрес таблицы (кратен 256) (table address, multiple of 256)
; DE <- адрес экрана (screen address)
install_plot    EQU BREAK+3

; Нарисовать линию точкой, установленной с помощью SET_SNP (draw line with that plot)
; DE <- X1, Y1
; BC <- X2, Y2
LINE        EQU install_plot+3

; Установить точку для LINE (install plot for LINE)
; HL <- адрес процедуры рисования точки (address of plot procedure), для которой в
;     DE <- X1, Y1
SET_SNP     EQU LINE+3

; Удалить из дискриптора окон все окна (remove all the windows from the descriptor of saved windows)
ERASE_ALLW  EQU SET_SNP+3

; Закрыть из дискриптора все окна (close all windows)
CLOSE_ALLW  EQU ERASE_ALLW+3

; Умножение (multiply)
; HL = A*H
MULS        EQU CLOSE_ALLW+3

; Умножение (multiply)
; HL = B*C
Mult        EQU MULS+3

; Деление (divide)
; HL = HL/DE
DIV     EQU Mult+3

; Деление (multiply)
; DE=DE/BC
Div     EQU DIV+3

; Сохранить спрайт экрана (save sprite from screen)
; [IX] <- DB x, y, длина (width), высота (height)
; DE   <- адрес сохранения (save address)
; DE   -> адрес сохранения+размер спрайта (save address+sprite size)
SaveWS      EQU Div+3

; Сохранить спрайт атрибутов
; [IX] <- DB x, y, длина (width), высота (height)
; DE   <- адрес сохранения (save address)
; DE   -> адрес сохранения+размер спрайта (save address+sprite size)
SaveWA      EQU SaveWS+3

; Напечатать спрайт экрана
; [IX] <- DB x, y, длина (width), высота (height)
; DE   <- адрес спрайта (save address)
; DE   -> адрес спрайта+размер спрайта (save address+sprite size)
LoadWS      EQU SaveWA+3

; Напечатать спрайт атрибутов
; [IX] <- DB x, y, длина (width), высота (height)
; DE   <- адрес спрайта (save address)
; DE   -> адрес спрайта+размер спрайта (save address+sprite size)
LoadWA      EQU LoadWS+3

; Вызвать меню смены дисководов (call menu for changing drives) (A,B,C,D,E)
; Если на выходе установлен флаг переноса, то ошибка или
; нажат Cancel (CY=1 on exit means Cancel or error)
Driver      EQU LoadWA+3

; Вызвать сообщение о потери данных или их отсутствии (show message "data lost")
NoData_     EQU Driver+3

; Диалоговое окно "Вы уверены?" (prompt "Are you sure?")
; Если на выходе установлен флаг переонса, то не уверены,
; иначе уверены (CY=1 means No, CY=0 means yes)
ASK     EQU NoData_+3

; Очистить окно (clear window)
CLSVV       EQU ASK+3

; Установить атрибут окну (set window attributes)
setv        EQU CLSVV+3

; Узнать текущую страницу, установленную с помощью RAM (get current page number)
; A -> номер страницы (0,1,2,3,4,5,6,7)
GetRAM      EQU setv+3

; Узнать выбранный атрибут в RGB (get attribute selected in RGB)
; A -> атрибут RGB
GetATR      EQU GetRAM+3

; Замикшировать атрибут с атрибутом RGB (mix attribute with attribute selected in RGB)
; A -> атрибут
; A <- измененный атрибут в зависимости от установок RGB
MIXCOL      EQU GetATR+3

; Очисить экран с атрибутом #07 (clear screen with attribute #07)
CLS     EQU MIXCOL+3

; Открыть страницу расширенной памяти, искл. 2,5 (set page except 2,5)
ONPAGE      EQU CLS+3

; Инвертировать окно (invert window)
INV     EQU ONPAGE+3

; Установить текущий экран 0 (set current screen 0, i.e. 1)
SET_SCR1    EQU INV+3

; Установить текущий экран 1 (set current screen 1, i.e. 2)
SET_SCR2    EQU SET_SCR1+3

; Установить атрибуты окна с установленным атрибутом RGB (set window attributes with attributes selected in RGB?)
SETV        EQU SET_SCR2+3

; Распаковать LaserCompact 5.2 на экран #4000 (depack to screen)
; HL <- откуда (from)
DECOMPR     EQU SETV+3

; Обменять основной экран с экраном, находящимся в текущей
; странице (exchange screens)
SwpSRam     EQU DECOMPR+3

; Вываливающееся окно (pop-up menu)
; IX <- адрес материнского окна (parent window)
; HL <- адрес дочернего окна (вываливающегося) (child window)
; С вызовом функции Win (calls Win)
PupMnu      EQU SwpSRam+3

; То же самое, но не вызывается Win, а настраивается окно (the same, but doesn't call Win, just sets the window)
pupmnu      EQU PupMnu+3

; Поместить 11 байт из 23773 (сюда кладет файлер имя файла)
; в адрес, находящийся в регистре DE (copy 11 bytes of file name from 23773 (filename from file selector) to (DE))
; DE <- адрес буфера имени файла (filename buffer addr)
ToName      EQU pupmnu+3

; Функция обратная функции ToName (reverse to ToName)
; HL <- адрес буфера имени файла (filename buffer addr)
FromName    EQU ToName+3

; Попиксельная печать спрайта 1x1 (print sprite pixel perfect)
; HL - адрес спрайта (sprite address)
; BC - x,y
OutPix      EQU FromName+3

; Методы наложения Для OutPix (output methods for OutPix)
OR_Pix      EQU OutPix+3
XOR_Pix     EQU OR_Pix+3
AND_Pix     EQU XOR_Pix+3

; Настройки курсора и системы для BGE (cursor settings)
IniVar      EQU AND_Pix+3

; Рамочка (frame)
; SCF   <- выбор размера (size selection)
; XOR A <- перемещение по экрану (moving on screen)
Ramka8      EQU IniVar+3
Ramka8_     EQU Ramka8+3
Ramka1      EQU Ramka8_+3

; Вызов настройки палитры с выводом основного экрана (call palette with printing main screen)
PRGB        EQU Ramka1+3

; Вызов настройки палитры без вывода основного экрана (call palette without printing main screen)
PRGB2       EQU PRGB+3

; Редактор спрайта (sprite editor)
; Параметры следующие
; HL <- адрес таблицы параметров (address of parameter table)
; IX -> окно редактора спрайта (sprite editor window)
; A  -> так же, как и после вызова Win или Winn (as after Win or Winn call)
;TBFnt1 DB #07,#04   ; X,Y окна (X,Y of window)
;   DB #11,#08   ; ширина (width), высота (height)
;   DW FBuff     ; адрес спрайта (sprite address)
;   DW #0103     ; X,Y окна редактора (X,Y of editor window)
;   DW #0101     ; размеры спрайта (sprite size)
;   DW #0603     ; X,Y preview
;   DW BEText    ; текст (text)
;   DW BESel     ; подсветка (highlighting)
;   DW BEHot     ; горячие клавиши (hotkeys)

; Внимание ! Редактор спрайта использует область памяти с #BC00 по #BFFF для таблицы точек.
; Следите чтобы длина плагина не перекрывала эту область

; Окно можно перемещать по экрану, можно выходит из окна,
; кликнув курсором мимо окна (window can be moved by screen and can be closed by clicking outside)
SPEdit      EQU PRGB2+3
; Окно статическое (static window)
SPEdit_     EQU SPEdit+3

; Распаковщик HRUSTовских файлов 1.oo, 1.o1, 1.o2, 1.o3 (depacker for HRUST1.x files)
; HL <- откуда (from)
; DE <- куда (to)

DEHRUST     EQU SPEdit_+3

; Пересчет коорднат относительно окна (re-count coordinates relative to the window)
; DE <- относительные координаты (relative coords)
; DE -> абсолютные координаты (absolute coords)
RealWin     EQU DEHRUST+3

; Вызов GUI функции, но только для процедур, работающих как-бы
; из-под самой GUI, но вне страницы GUIPage
;(call GUI function, for procedures working from GUI outside GUIPage)
GUI_        EQU RealWin+3

; Цвет бордюра (border color) (byte)
BORDER      EQU GUI_+3

; Окно "с ошибкой" ("error" window)
; A <- номер ошибки (error number)
GET_MSG_    EQU BORDER+1

; Инициализация ProgessBar, т.е. его вывод на экран с обнулени-
; ем и сохранением бэкграунда окна для его восстановления по
; CLOSE (init ProgressBar, show it on screen with 0% and saving the background to recover it by CLOSE)
PERCINI     EQU GET_MSG_+3

; Вывод ProgressBar (show ProgressBar)
; A <- какой процент (0-100%)
PRCN        EQU PERCINI+3


;-------- add in BGE v3.09 ---------


; Вызов лупы из плагина. Внимание, удаляются все открытые окна ! /DA
LOUPE           EQU PRCN+3


;-------- add in BGE v3.11 ---------


; Выбор пиксельной маски
PMask           EQU LOUPE+3

; Инициация пиксельной маски
PMskInit        EQU PMask+3

; Выбор текстуры
Texture         EQU PMskInit+3

; Заполнить область указанным атрибутом
; [IX] <- DB x, y, длина (width), высота (height)
; A  <- color attribute
SetWA           EQU Texture+3

; Вывод серии спрайтов    /DA
; [IX] <- DB x,y,длина спрайта (width), высота спрайта (height), расстояние по X, расстояние по Y, цвет спрайтов
;            расстояние это число знакомест от начала текущего спрайта до начала следующего.
; DE   <- адрес начала последовательности спрайтов
; HL   <- количество пропускаемых байт от конца данных спрайта до начала данных следующего
; A    <- количество спрайтов в строке ; >=1
; С    <- общее количество спрайтов    ; >=1
WSseries        EQU SetWA+3


;-------- add in BGE v4.0 ---------


; Очистка внутренней области окна
; [IX] <- параметры текущего окна ( DB x, y, длина (width), высота (height),...)
; DE <- координаты в окне:  D - x , E - y
; BC <- размер:  B - sx , C - sy
CleanWS         EQU WSseries+3

; Вызов редактора имени файла с опцией файлера
; in: DE <- name addres , HL <- sort tab.
; out: -> filename to name addres, file parameters in FILE_PARAM,
; A -> file number or #FF for not filer used
; scf for error
FNSelect        EQU CleanWS+3

; Диалоговое окно "Страница данных может быть испорчена !" (prompt "AddPage data may be corrupted !")
; Если на выходе установлен флаг переонса, то не продолжать,
; иначе продолжать (CY=1 means No, CY=0 means yes)
AskAddP         EQU FNSelect+3

; Диалоговое окно с текстом вопроса
; in:  HL <- адрес строки предупреждения (38 символов максимум, заканчивается нулём)
; Если на выходе установлен флаг переонса, то не продолжать,
; иначе продолжать (CY=1 means No, CY=0 means yes)
AskQ            EQU AskAddP+3

; Вызов процедур внутренней работы с выделенным окном (Только для расширений обработки окон x8,x1 )
; Формат вызова:  CALL WinFunc : DB Function_Number  ; вызывает функцию по номеру
WinFunc         EQU AskQ+3

; Получить код буквы текущего дисковода (именно буквы)
; out: A -> char of current drive
GetDrive        EQU WinFunc+3