; Кернель функций BGE 3.oo
;---------------------------------------------------------------
;	       Описание	кернеля	Burial Gfx Editor 3.oo
;---------------------------------------------------------------
; Модуль располагается с адреса	PgnAdr (#A500) и
; может	иметь максимальную длину #1B00 (6912) байт
; Plug-in is placed at PgnAdr (#A500), max size=#1B00 (6912)
;---------------------------------------------------------------
; На входе в плагин (at plug-in entry):
; HL - адрес резидент SupremeGUI (address of the resident)
; DE - адрес выхода из модуля (address or plug-in exit):
;      SCF - модуль не оставлять (модуль с ошибкой и т.п.) (don't keep the plug-in - error etc)
;      A = 0 перерисовывать главное меню сначала (redraw the Main menu)
;      A = 1 закрыть все окна и выйти в главное меню (close all the windows and go to Main menu)
;---------------------------------------------------------------
; Константы (constants) BGE 3.00
;
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"
;---------------------------------------------------------------

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 (сюда кладет файлер имя файла)
; в адрес, находящийся в регистре HL (copy 11 bytes of file name from 23773 (filename from file selector) to (HL))
; 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)

; Окно можно перемещать	по экрану, можно выходит из окна,
; кликнув курсором мимо	окна (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
