;+-------------------------------------------------------------+
;|        (c) sinn/delirium tremens/freedom'2oo1               |    ; Изменено под SjASMPlus /DA
;+-------------------------------------------------------------+    ; Изменен
;| Модуль, покзывающий возможности 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
;+-------------------------------------------------------------+

        device  zxspectrum128       ; for SjASMPlus

    INCLUDE "../KerBGE.asm"
    INCLUDE "../NumGUI.asm"
    ORG #6128       ; адрес расположения перемнных
    INCLUDE "../GuiVar.asm"    ; 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  DB 4,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)
; Bit 4 - запрет выхода по клику за пределами окна (добавлено для BGE 4.xx работает при Bit 3 = 1 ) / Dart Alver
    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) или 128+(количество опций 1-ой высоты) (для BGE 4.xx) , флаг (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

    ; Новая версия с примером сокращений по вертикальной группе (для BGE 4.xx) ;/ DA
    ; в принципе было достаточно 'DB 1,3,15,128+9,%11' но для примера разбил на куски
         DB 1,3,15,128+4,%11   ; 128+4 - описывыет 4 опции 1-го размера
         DB 1,7,15,1,%11       ; традиционный вариант
         DB 1,8,15,128+4,%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

         ASSERT $ < #C000
         savebin "example.add",PgnAdr,$-PgnAdr
         DISPLAY "Lenght : ",/a,$-PgnAdr
