;+-------------------------------------------------------------+
;| (c) sinn/delirium tremens/freedom'2oo1		       |
;+-------------------------------------------------------------+
;| Модуль, покзывающий возможности GUI и BGE примерно на       |
;| 70 процентов	(остальные проценты обламывает описывать, тем  |
;| более, что они - 30 процентов, не нужны при написании       |
;| модуля средней сложности				       |
;+-------------------------------------------------------------+
;| Некоторые стандартные весчи:				       |
;|  есть такие функции,	которые	могут возвращать ошибки	-      |
;|  дисковые, нажатие на Cancel, некорректная работ и т.д.     |
;|  Так	вот, корректность отработанной функции можно и нужно   |
;|  определять по флагу	переноса. Если он установлен, то       |
;|  была ошибка, если сброшен, то все просто ЛяМур	       |
;| Пример:						       |
;|	   DOS_FUNC - эмуляция #3D13			       |
;|		       SCF - дисковая ошибка или Break	       |
;|	   R8Sel    - выбор рамки 8x8			       |
;|		       SCF - нажат Break		       |
;| и так далее - по тексту исходника можно увидеть - кто ищет, |
;| тот всегда чемпион среди чемпионов			       |
;+-------------------------------------------------------------+
;| There are functions that return errors:
;| disk errors, Cancel, wrong function etc.
;| Check CY flag to know about errors:
;| CY=1 means there was an error. CY=0 is OK.
;| Example:
;|	   DOS_FUNC - emulate #3D13
;|		       SCF - disk error or Break
;|	   R8Sel    - select frame 8x8
;|		       SCF - Break pressed
;+-------------------------------------------------------------+

	INCLUDE	"KerBGE"
	INCLUDE	"NumGUI"
	ORG #6128		; адрес	расположения перемнных
	INCLUDE	"GuiVar"	; GUI (не менять!!!) don't change!!!

	ORG PgnAdr		; адрес	старта модуля

START	LD (RETAD+1),HL
	CALL Example
	XOR A
RETAD	JP 0

Example	CALL LOADSCR
	CALL ERASE_ALLW		; удалить все окна, если они
				; были внесены в реестр
	LD A,%1111		; прорисовка окна заново
example	LD IX,WExamp
	LD (IX+6),A
	LD A,Win		; вызвали окно с
	CALL GUI		; интерфейсом
	CP #FF
	RET Z			; борода
	LD BC,TBExamp
	JP TAB_JP
return_	CALL CLOSE		; закрыли последнее окно
return	LD A,%1101		; окно не перерисвывать
	JR example

Ret	RET

TBExamp	DW Win1
	DW Win2
	DW Win3
	DW Win4
	DW Win5
	DW Win6
	DW Win7
	DW Win8
	DW Win9
	DW Win10 ; для этой опции нет подсветки (no highlighting for this option),
		 ; но горячая клавиша подвешана (but there is a hotkey)

WExamp	DB4,4,17,15,5*8,5,%1111
; Bit 0	- окно с заголовком/без (window with title)
; Bit 1	- "перерисовать" окно да/нет (redraw window)
; Bit 2	- тискать окно по экрану да/нет (movable window)
; Bit 3	- выход из окна-ткнуть только лишь за пределами (CANCEL by clicking outside the window)
	DB 0	       ; запасной байт-флаг (reserved for flags)
	DW TExamp       ; объект-текст (text object)
	DW SExamp       ; объект-подсветка (выборка) (highlighting object)
	DW HExamp       ; горячие клавиши (hotkeys)
;	DW Nil		; объект-кнопки (выборка) (buttons object)
;	DW Nil		; объект-флажки (flags object)
;	DW Nil		; объект-радио кнопки (radio buttons object)
;	DW Nil		; ползунок (scrollbar)
;	DW Nil		; вызов при создании (call on create)
;	DW Nil		; вызов на "прерываниях" (call "on interrupt")
	DW #FFFF
TExamp	DB "Supreme version 1.oo",13
	DB "Прость напросто окно	[W]",13
	DB "Редактор спрайта 1x1	[E]",13
	DB "Файлер+загрузка	[F]",13
	DB "Редактор имени+запись[T]",13
	DB "Списки		[S]",13
	DB "Флажки и все	такое	[R]",13
	DB "Окно	с прерыванием	[I]",13
	DB "Окно	с созданием	[C]",13
	DB "Определить дисковод	[D]",13
	DB 15,13
	DB "Нажмите	 [SS+Enter]",0
; Объект подсветка (highlighting object):
; x, y, длина (width), высота (height), флаг (flag):
; bit 0 - подсвечивать (да/нет) (highlight yes/no)
; bit 1 - клавиша "заморожена" ("frozen" key)
SExamp	DB 1,3,15,1,%11
	DB 1,4,15,1,%11
	DB 1,5,15,1,%11
	DB 1,6,15,1,%11
	DB 1,7,15,1,%11
	DB 1,8,15,1,%11
	DB 1,9,15,1,%11
	DB 1,10,15,1,%11
	DB 1,11,15,1,%11
	DB #FF

; объект-горячие клавиши (hotkeys object)
; первая клавиша (1st key), вторая клавиша (2nd key)
; если старший байт 0 - номер опции (MSB=0 - option number)
; если старший байт не 0 - адрес перехода (MSB!=0 - jump address)
;(стек	не восстанавливается,
; придется это делать самому - из переменной [Spp],
; страница GUI не меняется на текущую)
;(stack doesn't recover,
; you must do it yourself - from variable [Spp],
; GUI page doesn't change to the current one)

HExamp	DB "W",0
	 DW 0
	DB "E",0
	 DW 1
	DB "F",0
	 DW 2
	DB "T",0
	 DW 3
	DB "S",0
	 DW 4
	DB "R",0
	 DW 5
	DB "I",0
	 DW 6
	DB "C",0
	 DW 7
	DB "D",0
	 DW 8
	DB 13,SS       ; двойная клавиша (double key) SS + Enter
	 DW 9
	db #ff
; - Опция 1 (Option 1) ---------------------------------------
Win1	LD IX,WAbout
	LD A,Window
	CALL GUI
	LD A,NOKEY
	CALL GUI
	LD A,WAITKEY
	CALL GUI
	JP return_
WAbout	DB 7,9,17,5,7,7*8,%1111
	DB 0	       ; запасной байт-флаг
	DW TAbout       ; объект-текст
	DW #FFFF
TAbout	DB "Окно	в Явропу",13
	DB "Привет всем от sinn'a `",0
; - Опция 2 (Option 2) ---------------------------------------
Win2	LD HL,TBBrs1	; параметры для	редактора
	CALL SPEdit	; вызов	редактора
	CP #FF		; на выходе - как после	Win или	Winn
	JP Z,return_
	AND A
	JR Z,delmatr
	DEC A
	JR Z,invmatr
	JR return2	; а это	для кнопки (for the button)
invmatr	LD B,8
	LD HL,BBuff
dz1	LD A,(HL)
	CPL
	LD (HL),A
	INC HL
	DJNZ dz1
return2	LD A,%1101
	LD (IX+6),A	; на выхода в IX - окно редактора (IX=editor window)
	JR Win2
delmatr	LD HL,BBuff
	LD DE,BBuff+1
	LD BC,7
	LD (HL),0
	LDIR
	JP return2
TBBrs1	DB #05,#05	; X,Y окна (X,Y of window)
	DB #0D,#08	; ширина (width), высота (height)
	DW BBuff	; адрес спрайта (sprite address)
	DW #0103	; X,Y окна редактора (X,Y of editor window)
	DW #0101	; размеры спрайта (sprite size)
	DW #0603	; X,Y preview
	DW BrsText	; текст (text)
	DW BrsSell	; подсветка (highlighting)
	DW Nil		; горячие клавиши (hotkeys)

BrsText	DB "Мартрица 1x1",13
	DB 22,8,3	; 22,x,y - новые координаты в окне (new coordinates in window), но
			 ; обязательно сразу после 13 (must be after 13)
	DB "Убрать",13
	DB "Инверт",0
BrsSell	DEFB 8,3,4,1,%11
	DEFB 8,4,4,1,%11
	DEFB #FF
BBuff	DS 8		; буфер
; - Опция 3 (Option 3) ---------------------------------------
Win3	LD HL,SORTscr	; таблица сортировки
	CALL FilerE	; вызов	файлера
	JP C,return	; произошла ошибка или вышли по	cancel
	CALL SV_UNDO	; поместили старое изображение в Undo
	LD HL,#8000		; буфер (buffer)
	LD DE,SCREEN		; куда (to)    = HL
	LD IX,(START_SEC)	; где на диске (where on disk) = DE
	LD BC,#1B05		; стандартно (standard) = BC
	LD A,ScrPage		; в какую страницу (to what page)
	EX AF,AF'
	LD A,SL_BANK		; вызвали загрузку ч/з свап
	CALL GUI		; если на выходе SCF, то
				; произошла ошибка (SCF=error)
	LD DE,FnScr		; скопировали имя выбранного в
	CALL ToName		; менеджере файла в буфер
				;copy the chosen file name into buffer
	JP Example
SORTscr	DB 0,27,#FF	       ; см. в KerBGE.H
FnScr	DB "безимениscr"       ; буфер имени (11 символов) (filename buffer - 11 symbols)
; - Опция 4 (Option 4) ---------------------------------------
Win4	LD HL,FnScr		; адрес	буфера имени
	CALL FNEdit		; вызов	редактора имени
	JP C,return		; отмена

	LD HL,#8000		; буфер (buffer)
	LD DE,SCREEN		; откуда (from) = HL
	LD IX,6912		; длина (length)= DE
	LD BC,#1B0B		; стандартно (standard) = BC
	LD A,ScrPage		; страница (page)
	EX AF,AF'
	LD A,SL_BANK		; если на выходе
	CALL GUI		; SCF, то произошла ошибка (SCF=error)
	JP return

; - Опция 5 (Option 5) ---------------------------------------
Win5	LD HL,8			; более	подробнее см.
	LD (SpLen),HL		; в GuiVar.H
	LD HL,8			; разделе
	LD (SpLenW),HL		; Main variable of ListBox
	LD HL,8
	LD (SpLenD),HL
	LD HL,Ret
	LD (SpDop),HL
	LD A,5
	LD (SpBar),A
	LD HL,SPISOKW
	LD (SpAdr),HL
	LD (SpAdrT),HL
	LD HL,Ret
	LD (SpDop2),HL
	LD HL,FSpisok
	SCF			; ползунок оставить на том
	EX AF,AF'		; месте, где он был раньше,
				; если заменить на XOR A, то
				; ползунок встанет на начало
				; списка
	LD A,Spisok
	CALL GUI		; с переменной SelSp - номер
				; элемента в списке, а если
				; cancel, то #FF
				; SelSp = item number in the list (#FF=cancel)
				; HL - адрес элемента в списке
				; HL - address of an item in the list
	JP C,return_		; cancel
	CALL Win5_1
	JP return_

FSpisok	DB 8,12		; ширина окна
	DW Nil		; обработка кнопок
	DW Nil		; обработка прерываний
	DB 6,4		; X,Y скроллинга
	DB 8		; сколько всего в окне
	DB 6		; высота ползунка
	DW #0103		; X,Y списка в окне
	DW TEXTFW	; адрес	текста

TEXTFW	DB "  Список",13	; заголовок списка
	DB 0

SPISOKW	DB "Номер  0"
	DB "Номер  1"
	DB "Номер  2"
	DB "Номер  3"
	DB "Номер  4"
	DB "Номер  5"
	DB "Номер  6"
	DB "Номер  7"
	DB "Номер  8"
	DB "Номер  9"
	DB "Номер 10"
	DB "Номер 11"
	DB "Номер 12"
	DB "Номер 13"
	DB "Номер 14"
	DB "Номер 15"
	DB "Номер 16"
	DB "Номер 17"
	DB "Номер 18"
	DB "Номер 19"
	DB "Номер 20"
	DB 0		       ; окончание списка

Win5_1				; HL - адрес в списке
	LD DE,adrel		; DE - куда конвертить число
	LD C,1			; 1 режим - из HL (word)
	LD A,GET_NUM
	CALL GUI

	LD A,(SelSp)		; A  - номер элемента
	LD DE,noel		; DE - куда конвертить число
	LD C,0			; 0 режим - из A (byte)
	EX AF,AF'
	LD A,GET_NUM
	CALL GUI

	LD IX,EWin5_1
	LD A,Window		; простое окно
	CALL GUI
	LD A,NOKEY		; пока нажата клавиша...
	CALL GUI
	LD A,WAITKEY		; пока не нажата клавиша...
	CALL GUI
	CALL CLOSE		; закрыть окно
	RET

EWin5_1	DB 8,10,10,4,5*8,5,%1110,0
	DW TEWin51
	DW #FFFF

TEWin51	DB "Выбран:  "
noel	DB "000",13
	DB "Адрес: "
adrel	DB "00000",0
; - Опция 6 (Option 6) ---------------------------------------
Win6	LD A,%1111
win6	LD IX,WRadi
	LD (IX+6),A
	LD A,Win
	CALL GUI
	CP #FF
	JP Z,return_
	CP 12
	JR Z,edit1
	LD A,(But)
	AND A
	JR Z,but1
	JP return_
win6_	LD A,%1101
	JR win6

but1	CALL ASK
	JR C,win6_
	XOR A
	LD (PERC),A
	LD A,%1111
but1_	LD IX,WBut1
	LD (IX+6),A
	LD A,Window
	CALL GUI
	LD A,0
PERC	EQU $-1
	INC A
	LD (PERC),A
	CP 100+1
	JR Z,EPERC
	LD C,0
	LD DE,tbut1
	EX AF,AF'
	LD A,GET_NUM
	CALL GUI
	CALL BREAK ; опрашиваем главные кнопки (FIRE, CANCEL)
	JR C,EPERC_ ; нажат CANCEL
	LD A,%1101
	JR but1_
EPERC	LD A,WAITKEY
	CALL GUI
EPERC_	CALL CLOSE
	JR win6_

edit1	LD HL,tedit1
	LD DE,#010B
	LD B,15
	XOR A
	EX AF,AF'
	LD A,EDIT
	CALL GUI
	JR C,win6_
edit2	LD HL,tedit2
	LD DE,#010C
	LD B,15
	XOR A
	EX AF,AF'
	LD A,EDIT
	CALL GUI
	JP win6_

WRadi	DB 3,3,16,14,7*8,7,%1111
; Bit 0	- окно с заголовком/без
; Bit 1	- "перерисовать" окно да/нет
; Bit 2	- тискать окно по экрану да/нет
; Bit 3	- выход	из окна-ткнуть только лишь за пределами	(CANCEL)
	DB 0           ; запасной байт-флаг
	DW TRadi       ; объект-текст
	DW SRadi       ; объект-подсветка (выборка)
	DW Nil         ; горячие клавиши
	DW BRadi       ; объект-кнопки (выборка)
	DW FRadi       ; объект-флажки
	DW RRadi       ; объект-радио кнопки
	DW #FFFF
TRadi	DB "Флажки и все такое",13
	DB "Флажок 1",13
	DB "Флажок 2",13
	DB "Флажок 3",13
	DB 15,13    ; черта на протяжении всего окна (delimiting line)
	DB "Радио 11",13
	DB "Радио 12",13
	DB "Радио 13",13
	DB 22,10,3
	DB "Флажок 4",13
	DB "Флажок 5",13
	DB "Флажок 6",13,13
	DB "Радио 21",13
	DB "Радио 22",13
	DB "Радио 23",13
	DB 22,1,10
	DB 15,13
	DB 22,1,11
tedit1	DB "Редактор текста",13
tedit2	DB "Редактор текста",0

SRadi	DB 1,3,7,1,%10
	DB 1,4,7,1,%10
	DB 1,5,7,1,%10
	DB 1,7,7,1,%10
	DB 1,8,7,1,%10
	DB 1,9,7,1,%10

	DB 8,3,7,1,%10
	DB 8,4,7,1,%10
	DB 8,5,7,1,%10
	DB 8,7,7,1,%10
	DB 8,8,7,1,%10
	DB 8,9,7,1,%10

	DB 1,11,10,2,%11
	DB #FF

; объект-флажок	(switch)
; x, y,	номер опции, состояние (#00/#FF)
; вызов	при щелчке на кнопку после того, как уже
; перенастроился объект	на новое положение
FRadi	DEFB 7,3,0,#FF
	DEFW Nil
	DEFB 7,4,1,#00
	DEFW Nil
	DEFB 7,5,2,#00
	DEFW Nil
	DEFB 8,3,6,#00
	DEFW Nil
	DEFB 8,4,7,#00
	DEFW Nil
	DEFB 8,5,8,#FF
	DEFW Nil
	DEFB #FF

; объект-радиогруппа (radiobuttons)
; x, y,	номер первой опции из группы, кол-во, текущий
; вызов	при щелчек на кнопку из	группы после того, как уже
; перенастроился объект	на новое положение
RRadi	DEFB 7,7,3,3,0
	DEFW Nil
rradi2	DEFB 8,7,9,3,0
	DEFW RFlash
	DEFB #FF

; обработчик OnClick на	группе rradi2
RFlash	LD A,(rradi2+4)
	INC A
	OUT (#FE),A
	EI
	HALT
	LD A,(BORDER)
	OUT (#FE),A
	RET

; x, y,	длина, высота, цвет, флаг
; адрес	спрайта	кнопки
; флаги:
; Bit 0	- клавиша нажимается (yes/no)
; Bit 1	- клавиша "заморожена"
BRadi	DEFB 11,11,2,2,7*8+1,%11
	DEFW BUT1
	DEFB 13,11,2,2,7*8+1,%11
	DEFW BUT2
	DEFB #FF

WBut1	DB 9,9,14,6,6,6*8,%1110
	DB 0	       ; запасной байт-флаг
	DW TBut1	       ; объект-текст
	DW #FFFF
TBut1	DB " Отправка сообщения",13
	DB "   Выполнено	"
tbut1	DB "000%",13
	DB " Прервать - Cancel",0

BUT1	DEFB #03,#E0,#0C,#18,#12,#A4,#2C,#04,#50,#02,#42,#C2
	DEFB #A0,#02,#85,#42,#A0,#02,#A6,#C4,#A0,#14,#50,#68
	DEFB #4F,#90,#30,#60,#0F,#80,#00,#00
BUT2	DEFB #03,#E0,#0C,#18,#12,#A4,#2C,#04,#50,#02,#44,#42
	DEFB #A2,#82,#81,#02,#A2,#82,#A4,#44,#A0,#14,#50,#68
	DEFB #4F,#90,#30,#60,#0F,#80,#00,#00

; - Опция 7 (Option 7) ---------------------------------------
Win7	LD IX,WImw
	LD A,Win
	CALL GUI
	JP return_

WImw	DB 2,3,18,7,6,6,%1111
; Bit 0	- окно с заголовком/без
; Bit 1	- "перерисовать" окно да/нет
; Bit 2	- тискать окно по экрану да/нет
; Bit 3	- выход	из окна-ткнуть только лишь за пределами	(CANCEL)
	DB 0	       ; запасной байт-флаг
	DW TImw	       ; объект-текст
	DW SImw	       ; объект-подсветка (выборка)
	DW Nil	       ; горячие клавиши
	DW Nil	       ; объект-кнопки (выборка)
	DW Nil	       ; объект-флажки
	DW Nil	       ; объект-радио кнопки
	DW Nil	       ; ползунок
	DW Nil	       ; вызов при создании
	DW IImw	       ; вызов на "прерываниях"
	DW #FFFF
TImw	DB "Моргание - на прерываниях",13
	DB "Опция 1",13
	DB "Опция 2",13
	DB "Опция 3",0
SImw	DB 1,3,16,1,%11
	DB 1,4,16,1,%11
	DB 1,5,16,1,%11
	DB #FF

IImw	LD A,6
	XOR 7
	LD (IImw+1),A
	CALL setv
	RET

; - Опция 8 (Option 8) ---------------------------------------
Win8	LD IX,WEmp
	LD A,Win
	CALL GUI
	JP return_

WEmp	DB 5,5,10,6,7,7,%1111,0
	DW TEmp	       ; объект-текст
	DW SEmp	       ; объект-подсветка (выборка)
	DW Nil	       ; горячие клавиши
	DW Nil	       ; объект-кнопки (выборка)
	DW Nil	       ; объект-флажки
	DW Nil	       ; объект-радио кнопки
	DW Nil	       ; ползунок
	DW CEmp	       ; вызов при создании
	DW #FFFF

TEmp	DB "PokeMon",13
	DB 0
SEmp	DB 1,3,8,1,%11
	DB 1,4,8,1,%11
	DB #FF

CEmp	LD HL,#BC00
	LD DE,#4000
	PUSH IX
	CALL install_plot
	POP IX
	LD HL,PLOT
	CALL SET_SNP
	LD DE,#0103
	CALL RealWin
	DUP 3
	SLA D
	SLA E
	EDUP
	LD A,8*8
	ADD A,D
	LD B,A
	LD A,2*8
	ADD A,E
	LD C,A
	CALL LINE
	RET

PLOT	LD L,E
	LD H,#BC00/256
	LD A,(HL)
	INC H
	LD B,(HL)
	INC H
	LD L,D
	ADD A,(HL)
	LD C,A
	INC H
	LD A,(BC)
	OR (HL)
	LD (BC),A
	RET
; - Опция 9 (Option 9) ---------------------------------------
Win9	CALL Driver
	JP return
; - Опция 10 (Option 10) -------------------------------------
Win10	CALL LOADSCR
	JP Example

LEN	EQU $-PgnAdr
	display "Длина модуля: ",LEN," байт"

	ORG BGE_RUN
