; part of the GUI for BGE

; почистил часть комментов /DA v 3.12

Win_gui
        CALL NOKEY_gui
Winn_gui
        CALL Window_gui
Arrow
         call NoFF.FF
        LD (But),A
        INC A
        LD (KEY1),A
        LD (KEY2),A
        LD (LAST_KEY),A
        LD (DIRECT),A
        ld (MWHEEL),a
        CALL AllSelect
arrow_  xor a                 ; обнуляем флаг нажатия файра
        ld (arrow_ff),a
arrow
1       LD HL,(HotAdr)
        CPHL0
        JR Z,arrps1
        CALL REDEF_gui
        CALL HotKey
        JR C,arrex
arrps1  LD HL,(ImAdr)
        CPHL0
        CALL NZ,JPHL
        CALL BUTTON_gui
        JP C,ExitWin
cexi
        CALL PUTARW_gui
        call Select
         ld hl,(ImArrAdr)      ; вызов на прерываниии после прорисовки стрелки /DA
         CPHL0
         call nz,JPHL
        XOR A
        LD (LAST_KEY),A
        EI
        HALT
        CALL DIRSCN_gui
        CALL MOVES_gui
        CALL GETARW_gui
         call sel_drow
         ld hl,(ScrAdr)
         ld a,h
         or l
       jr z,1F
        ld a,(MWHEEL)
        or a
       jr nz,2F       ; если сработал скроллер, то на обработку.
1       LD A,(DIRECT)
        AND #10
        JR Z,arrow_
        ld a,0
arrow_ff EQU $-1           ; флаг перемещения нажатой стрелки
         or a
       jr nz,arrow
         inc a
         ld (arrow_ff),a
        CALL BarOff
        CALL Button_gui
2       CALL Scroll
arrex   CALL Switch
        CALL Radio

;Обработчик - Попала ли стрелка на заголовок или нет
        BIT 2,(IX+6)
        JR Z,setnumb
        LD A,(DIRECT)
        AND #10
        JR Z,setnumb

        LD B,(IX+2)
        LD C,(IX+3)
        PUSH BC
        LD A,2
        BIT 0,(IX+6)
        JR NZ,.jr1
        DEC A
.jr1    LD (IX+3),A
        LD DE,(ARW_XC)
        CALL lookbox
        JR NC,MoveWin
        POP BC
        LD (IX+2),B
        LD (IX+3),C

setnumb BIT 3,(IX+6)
        JR Z,psar
        LD A,(But)
        INC A
        JR NZ,psar
        LD A,(Numb)
        INC A
        JR NZ,psar
        LD DE,(ARW_XC)
           bit 4,(ix+6)    ; if bit4=1 and bit3=1 then only press cancel for exit / DA
          jp nz,arrow
        CALL lookbox
        JP NC,arrow
          ld a,(BRK)      ; отлов клика вне окна for v4.0 /DA
          or %1000
          ld (BRK),a

psar    LD A,(But)
        CP #FF
        JR Z,setn
        LD B,0
AllBar  EQU $-1
        ADD A,B
        LD (Numb),A
setn    LD A,(Numb)
        RET

ExitWin
;       BIT 3,(IX+6)
;       JP Z,cexi
        CALL BarOff
        LD A,#FF
        LD (Numb),A
        LD (But),A
        RET


Ixx     DEFS 4

;Drag'n'Drop в худших традициях Windows'95

MoveWin POP BC

pup
        LD HL,(ARW_X)
        LD (ARWRR),HL
        LD H,(IX+1)
        LD L,(IX+0)
        add hl,hl
        add hl,hl
        add hl,hl
        LD A,(ARW_Y)
        SUB H
        LD H,A
        LD A,(ARW_X)
        SUB L
        LD L,A
        LD (ARWR),HL

        LD (IX+2),B
        LD (IX+3),C
        LD (Ix),IX

        PUSH IX
        POP HL
        LD DE,Ixx
        LD BC,4
        LDIR

        LD L,(IX+0)
        LD H,(IX+1)
        LD (ARW_XC),HL
       ; CALL HLmul8   ; вызов занимает столько же места сколько процедура ))  /DA
         add hl,hl
         add hl,hl
         add hl,hl
        LD (ARW_X),HL

        LD IX,Ixx

ContMov CALL RAMKA_gui
Arr     CALL DIRSCN_gui
        CALL MOVES_gui
        HALT
        LD A,(DIRECT)
        CP #10
        JR Z,Arr
        AND #10
        JR Z,ReMove

        CALL RAMKA_gui
        LD HL,(ARW_XC)
        LD (IX+0),L
        LD (IX+1),H
        JR ContMov

ReMove  CALL RAMKA_gui
        PUSH IX
        POP HL

        LD IX,0
Ix      EQU $-2

        LD A,(Ixx+0)
        ADD A,(IX+2)
        CP 31+2
        CALL NC,corx_
        LD A,(Ixx+1)
        ADD A,(IX+3)
        CP 23+2
        CALL NC,cory_

        LD A,(Ixx+0)
        CP (IX+0)
        JR NZ,okrm
        LD A,(Ixx+1)
        CP (IX+1)
        JR NZ,okrm

norm    LD HL,0
ARWRR   EQU $-2
        LD (ARW_X),HL
        JP Arrow

corx_   LD A,32
        SUB (IX+2)
        LD (Ixx+0),A
        RET
cory_   LD A,24
        SUB (IX+3)
        LD (Ixx+1),A
        RET

okrm    EXX
        BIT 2,(IX+6)
        CALL NZ,RestBack
        EXX

        LD DE,(Ix)
        LD BC,2
        LDIR

        LD HL,0
ARWR    EQU $-2

        LD A,(IX+0)
        Amul8
        ADD A,L
        LD L,A
        LD A,(IX+1)
        Amul8
        ADD A,H
        LD H,A
        LD (ARW_X),HL
        DUP 3
        SRL L
        SRL H
        EDUP
        LD (ARW_XC),HL
        CALL SetINXY
        SET 1,(IX+6)
        CALL Window_gui
        JP Arrow

;HLmul8 ; DUP 3                 ; перенёс в 'Utils1.asm' v3.12 /DA
; ...
;Adiv8  ; SRL A
; ...

; -----------------------------------

TextAdr  DW 0
BarAdr   DW 0
HotAdr   DW 0
ButAdr   DW 0
SwiAdr   DW 0
RadioAdr DW 0
ScrAdr   DW 0
CrAdr    DW 0
ImAdr    DW 0

Esp__   EQU ($-TextAdr)/2
 ; ------- added for BGE new --------  /DA
ImArrAdr   DW 0   ; Вызов на прерываниях после прорисовки стрелки
SpritADR   DW 0   ; Адрес описания выводимых в окно спрайтов
ColBoxADR  DW 0   ; Адрес описания заполнееных атрибутом областей
BeforeDRW  DW 0   ; Адрес вызова перед прорисовкой окна
Esp      EQU ($-TextAdr)/2
;--------- адреса внутренних процедур GUI ----
HotBarAdr DW 0   ; адрес горячих клавиш для хотбара

EspF__    EQU ($-TextAdr)/2
EspFLen   EQU $-TextAdr


window2 LD DE,0
window4 LD (IX),E
        INC IX
        LD (IX),D
        INC IX
        DJNZ window4
        RET

; Инициализация окон

; HL - объекты в окне

IniAdr_gui        ; настройка объектов ; изменил и почистил комменты /DA v3.12

         ld b,EspF__
         ld ix,TextAdr
         call window2      ; обнуление предыдущих значений
         ld ix,TextAdr
         ld b,Esp
         ld e,6            ; de=0 после window2
         add hl,de
         ld a,(hl)
         inc hl
         inc hl
         and 128      ; проверка использования доп. адресов
        jr nz,window1
         ld b,Esp__   ; уменьшаем количество адресов

window1   DEFHL1          ; расширенный вариант /DA
          inc de          ; full exam for #FFFF addr
          ld a,d
          or e
         ret z            ; выход если #FFFF
          dec de
          ld a,d
          or a
         jr nz,.ns
          ld a,e          ; if de=#000n then skeep n-addresses (n= 1...F)
          dec a
          cp #0F
         jr nc,.ns
          ld a,b
          sub e
         ret c
         ret z
          ld b,e
          call window2
          ld b,a
        jr window1
.ns
         LD (IX),E
         INC IX
         LD (IX),D
         INC IX
        DJNZ window1
        RET

IniWin  PUSH IX
        PUSH IX
        POP HL
        CALL IniAdr_gui
        POP IX
        LD H,(IX+0)
        LD A,H
        LD (WinX),A
        LD L,(IX+1)
        LD A,L
        LD (WinY),A
        LD (WinXY),HL
        RET

corx    LD A,32
        SUB (IX+2)
        LD (IX+0),A
        RET
cory    LD A,24
        SUB (IX+3)
        LD (IX+1),A
        RET

Window_gui
        LD (Ix),IX
        LD A,(IX+0)
        ADD A,(IX+2)
        CP 31+2
        CALL NC,corx
        LD A,(IX+1)
        ADD A,(IX+3)
        CP 23+2
        CALL NC,cory

        BIT 1,(IX+6)
        JR Z,pwi1
        BIT 2,(IX+6)
       jr nz,1F
        bit 6,(ix+6)      ; окно при перерисовке v3.12 /DA
       jr z,3F
       jr 2F
1       bit 6,(ix+6)
       jr nz,3F
2       call SaveBack
3       res 6,(ix+6)
pwi1    CALL IniWin

        BIT 1,(IX+6)
        CALL NZ,Box_start   ; Box

        call Print
        CALL DrwBut
        call DrwSprt    ; sprites /DA v3.12
        call DrwSelect  ; подсветочка
        call ColorBox_  ; color box /DA v3.12
        LD HL,(CrAdr)
        CPHL0
        CALL NZ,JPHL
        CALL DrwSwitch
        CALL DrwRadio
        CALL DrwScroll
        SET 1,(IX+6)
        RET

; Спрайтики   /DA
DrwSprt  push ix
         ld hl,(SpritADR)
         CPHL0
        jr z,.pIX
         push hl
         pop ix
         call .drwsprt
.pIX     pop ix
        ret

.drwsprt   ld a,(ix+0)
           inc a
          ret z
           ld a,(ix+5)
           bit 7,a       ; блокируем вывод спрайта
          jr nz,1F
           ld d,(ix+7)
           ld e,(ix+6)   ; de -addr of sprite
           bit 0,a
          jr z,2F          ; если спрайт атрибутов

           call ToScrOfI
           bit 1,(ix+5)
          jr z,1F        ; игнор цвета

           call RealWin_gui
           ld a,(ix+4)
           ld c,(ix+3)
           ld b,(ix+2)
           call SetAtr_gui

1          ld bc,8
           add ix,bc
          jr .drwsprt

2          call 3F    ; вывод спрайта атрибутов
          jr 1B
3           push de
            call RealWin_gui
           jp LoadWA.adr

; Область заполненная цветом (color box) /DA
ColorBox_
            ld hl,(ColBoxADR)
            CPHL0
           ret z
1           ld a,(hl)
            ld d,a       ; x
            inc a
           ret z       ; for #FF
            inc hl
            ld e,(hl)    ; y
            inc hl
            ld b,(hl)    ; sx
            inc hl
            ld c,(hl)    ; sy
            inc hl
            ld a,(hl)    ; color
            inc hl
            bit 0,(hl)   ; flag
            call nz,SetV      ; in 'Add.asm' ; hl - not changed
            inc hl
           jr 1B


; Обрабатываем радио-группу
Radio   PUSH IX
        LD HL,(RadioAdr)
        CPHL0
        JR Z,PopIX

        PUSH HL
        POP IX
radio   LD A,(IX+0)
;       CP #FF
        INC A
        JR Z,PopIX

        LD A,(Numb)
        LD B,(IX+2)
        CP B
        JR C,cradio
        LD A,B
        ADD A,(IX+3)
        LD B,A
        LD A,(Numb)
        CP B
        JR NC,cradio

        SUB (IX+2)
        LD (IX+4),A

        LD L,(IX+5)
        LD H,(IX+6)
        POP IX
        POP AF
        RES 1,(IX+6)
        CPHL0
        JR Z,nclr
        CALL JPHL
nclr    JP Win_gui

cradio  LD BC,7
        ADD IX,BC
        JR radio

; Рисуем радио-группу
; x, y, номер опции, кол-во, текущий

DrwRadio
        PUSH IX
        LD HL,(RadioAdr)
        CPHL0
        JR Z,PopIX

        PUSH HL
        POP IX

drwradi LD A,(IX+0)
        INC A
        JR Z,PopIX

        CALL RealWin_gui
        CALL RASCH

        XOR A
Lp_17   PUSH AF
        CALL Rad
        POP AF
        INC A
        CP (IX+3)
        JR NZ,Lp_17

        LD BC,7
        ADD IX,BC
        JR Z,drwradi

PopIX   POP IX
        RET

ROn     LD A,RadioOn
        JR CHAR
Rad     CP (IX+4)
        JR Z,ROn
ROff    LD A,RadioOff
CHAR    LD D,FONT/256
        LD E,A
        LD C,8
char_g  LD A,(DE)
        LD (HL),A
        INC H
        INC D
        DEC C
        JR NZ,char_g
        DEC H
        JP INC_Y

; Рисуем переключатели (SWITCH)
; x, y, номер опции, состояние

DrwSwitch
        PUSH IX
        LD HL,(SwiAdr)
        CPHL0
        JR Z,PopIX

        PUSH HL
        POP IX

drwswch LD A,(IX+0)
        INC A
        JR Z,PopIX

        CALL RealWin_gui
        CALL RASCH

        LD A,(IX+3)
        CALL SO
        LD BC,6
        ADD IX,BC
        JR drwswch

SO      AND A
        JR Z,SOff
        LD A,SwchOn
        JR CHAR

SOff    LD A,SwchOff
        JR CHAR

; Обрабатываем переключатели (SWITCH)

Switch  PUSH IX
        LD HL,(SwiAdr)
        CPHL0
        JR Z,PopIX

        PUSH HL
        POP IX
switch  LD A,(IX+0)
        INC A
        JR Z,PopIX

        LD A,(Numb)
        CP (IX+2)
        JR NZ,cswitch

        LD A,(IX+3)
        CPL
        LD (IX+3),A

        LD L,(IX+4)
        LD H,(IX+5)
        POP IX
        POP AF
        RES 1,(IX+6)
        CPHL0
        JR Z,nclsw
        CALL JPHL
nclsw   JP Win_gui

cswitch LD BC,6
        ADD IX,BC
        JR switch

        INCLUDE "ScrBarGUI.asm"

; Кнопочки

DrwBut  PUSH IX
        LD HL,(ButAdr)
        CPHL0
        JR Z,PopIX1
        PUSH HL
        POP IX
        CALL drwbut
PopIX1  POP IX
        RET

drwbut  LD A,(IX+0)
        INC A
        RET Z
         bit 7,(ix+5)  ; блокируем вывод кнопки  (v3.12) /DA
        jr nz,1F

        LD D,(IX+7)
        LD E,(IX+6)
        call ToScrOfI

        CALL RealWin_gui

        LD A,(IX+4)
        LD C,(IX+3)
        LD B,(IX+2)
        CALL SetAtr_gui

1       LD BC,8
        ADD IX,BC
        JR drwbut


; Обработчик кнопулечек

Button_gui
        PUSH IX
        CALL SetINXY
        XOR A
        LD (But),A
        CALL button
        POP IX
        RET


NoBut   LD A,#FF
        LD (But),A
        RET

button  LD HL,(ButAdr)
        CPHL0
        JR Z,NoBut

blp__   LD (SelAdr),HL
blp     LD A,(HL)
        INC A
        JR Z,NoBut
        CALL LookBox
       jr c,contbut

          ld a,(ix+5)
          bit 7,a
         jr nz,contbut
          bit 1,a
         jr z,contbut
          rra
         ret nc
        LD D,(IX+7)
        LD E,(IX+6)
        PUSH DE
        call ToScrOnI   ; CALL ToScrOn
        HALT
        HALT
        HALT
        CALL NOKEY_gui
        POP DE

       jp ToScrOfI ; Перекинул работу со спрайтами кнопок в ResGUI.asm и модифицировал /Dart Alver

contbut ld hl,But
        inc (hl)
        ld hl,(SelAdr)
        ld bc,8
        add hl,bc
       jr blp__

; DE - адрес спрайта
; IX - параметры спрайта

;ToScrOf
; ...
;ToScrOn
; ...

; Подсветка
DrwSelect   ld hl,(BarAdr)
            CPHL0
           ret z
.ll0
            ld a,(hl)
            ld d,a       ; x
            inc a
           ret z       ; for #FF
            inc hl
            ld e,(hl)    ; y
            inc hl
            ld b,(hl)    ; sx
            inc hl
            ld c,(hl)    ; sy
            inc hl
            ld a,(hl)    ; flag
            inc hl
            bit 7,b
           jr z,1F
            ld bc,5      ; пропускаем таблицу
            add hl,bc
           jr .ll0
1           bit 2,a
           jr z,.ll0     ; если нет бита 3, то идём дальше
            and %11      ; проверка бит 0,1
            ld a,(ix+4)  ; active color
           jr nz,1F
            ld a,(ix+7)  ; inactive color
1        ; прорисовка атрибута
            res 7,c
            call SetV
           jr .ll0

; Сколько всего подсветок-выборок
AllSelect
        XOR A
        LD (AllBar),A
        ld c,a
        LD HL,(BarAdr)
        CPHL0
        RET Z

allse    ld a,c            ; вот так /DA
         ld (AllBar),a
         LD A,(HL)
         INC A             ; cp #FF
        RET Z

          inc hl    ; +1
          inc hl    ; +2 width or 128+(tab width)
          ld a,(hl)
          inc hl    ; +3 height or 128+(number of options)
          and 128
         jr z,.noTb
          inc hl : inc hl : inc hl : inc hl : inc hl : inc hl ; +9 tab number of options
          ld a,(hl) ; количество опций в таблице
          inc hl    ; +10
         jr .sum
.noTb     ld a,(hl)
          inc hl    ; +4
          inc hl    ; +5
          bit 7,a
         jr z,1F
          and #7F
.sum      add a,c
          ld c,a
         jr allse
1         inc c
        JR allse


; Обработчик подсветочек
Select  PUSH IX
        CALL SetINXY
        CALL select
rix     POP IX
        RET

LookSel  ld de,(INXY)     ; для обработки селектов с вертикальными группами /DA
         push hl
         pop ix
         ld a,5
         ld (N_step),a
         ld c,(ix+2)      ; таблица ?
         bit 7,c
        jp z,.vert
         ld a,10
         ld (N_step),a
         ld a,(ix+9)
         ld (contsel.NVop),a          ; приращение опций для таблицы
         push de
         call .lk
         pop de
        ret c                        ; выход если не в таблице
         ld c,0
         ld a,(ix+2)
         and #7F              ; длина таблицы в знакоместах
         ld b,(ix+5)
1        sub b                ; находим количество столбцов
        jr c,2F
         inc c
        jr 1B
2        ld a,c      ; число столбцов
        ex af,af'

         ld c,0      ; x el tab
         ld a,e      ; x pos
         sub (ix+0)
         ld e,a
1        sub (ix+5)        ; находим номер столбца
        jr c,2F
         inc c
        jr 1B
2        add a,(ix+5)
         sub (ix+7)      ; выборка по длине
         ccf
        ret c              ; не попали в выборку
         ld b,0     ; y el tab
         ld a,d     ; y pos
         sub (ix+1)
         ld d,a
1        sub (ix+6)        ; находим номер строки
        jr c,2F
         inc b
        jr 1B
2        add a,(ix+6)
         sub (ix+8)      ; выборка по высоте
         ccf
        ret c              ; не попали в выборку
         ld a,b
         or a
        jr z,2F
         ex af,af'        ; a - число столбцов, b - строка, c - столбец

         push bc
         ld c,a
         xor a
1        add a,c
        djnz 1B
         pop bc
2        add a,c         ; a - номер опции в таблице
         cp (ix+9)
         ccf
        ret c
         ld (sVop),a
         ld l,(ix+6)    ; строка
         xor a
         inc b
         dec b
        jr z,2F
1        add a,l
        djnz 1B
2        ld l,a
         xor a
         ld b,c
         inc b
         dec b
        jr z,2F
         ld h,(ix+5)
1        add a,h
        djnz 1B
2        ld h,a        ; поз. в строке
         ld (slTBxy),hl
         or a
        ret

.vert   ld a,(ix+3)
        ld c,a
        and #7F
        bit 7,c
       jr nz,1F
        ld a,1
1       ld (contsel.NVop),a          ; приращение опций для вертикальной группы
.lk     ld a,e
        sub (ix+0)      ; x
       ret c
        ld e,a
        ld a,(ix+2)
        and #7F
        dec a
        cp e
       ret c
        ld a,d
        sub (ix+1)      ;y
       ret c
        ld e,a
        ld a,c
        and #7F
        dec a
        cp e
       ret c
        ld a,c
        and 128    ; bit 7 для проверки вертикальной группы
       jr z,1F
        ld a,e
1       ld (sVop),a        ; смещение для вертикальной группы
       ret

select  XOR A
        LD (Numb),A
        inc a
        ld (sel_drow.fNo),a
        LD HL,(BarAdr)
        CPHL0
        JR Z,NoFF.FF

sellp   LD (SelAdr),HL

        LD A,(HL)
        INC A
       jr z,set_sel_fNo   ; JR Z,NoFF
        CALL LookSel
        JR C,contsel
        BIT 1,(IX+4)
        JP Z,contsel

        LD A,(ONumb)
        LD C,A
        LD A,(Numb)
         add a,0          ; /DA
sVop   EQU $-1            ; смещение для номера опции вертикальной группы или таблицы
         ld (Numb),a
        CP C
        RET Z
             ld (sel_drow.ix_),ix
             ld a,#FF
set_sel_fNo  ld (sel_drow.fNo),a
             or a
            ret

sel_drow    ld a,0
.fNo  EQU $-1
            or a
           jr z,NoFF
            inc a
           ret nz
         push ix
        CALL BarOff
           ld ix,0
.ix_   EQU $-2
        CALL RealWin_gui
          bit 7,(ix+2)      ; tab ?   /DA
        jr z, 1F
          ld hl,0
slTBxy EQU $-2            ; pos. in tab
          add hl,de
          ex de,hl
         jr 2F
1         ld a,(sVop)
          add a,e
          ld e,a
2       CALL RASCH
        LD (AdrHL),HL

        LD A,(IX+4)
        LD (Af),A
        CALL Bar
        LD A,(Numb)
        LD (ONumb),A
         pop ix
        RET

contsel  LD HL,Numb

          ld a,(hl)
          add a,0
.NVop   EQU $-1     ; количество опций для вертикальной группы /DA
          ld (hl),a
        LD HL,0
SelAdr  EQU $-2
        LD BC,5
N_step EQU $-2       ; приращение для следующего
        ADD HL,BC
        JR sellp

NoFF    CALL BarOff
.FF     LD A,#FF
        LD (Numb),A
        LD (ONumb),A
        RET

BarOff  LD A,0
ONumb   EQU $-1
        INC A
        RET Z
        LD HL,0
AdrHL   EQU $-2
        LD BC,0
AdrBC   EQU $-2
        JR bar

Bar     LD B,(IX+2)
        LD C,(IX+3)
           bit 7,b       ; таблица   /DA
          jr z,1F
           ld b,(ix+7)
           ld c,(ix+8)
          jr 2F
1          bit 7,c       ; вертикальная группа /DA
          jr z,2F
           ld c,1
2       LD (AdrBC),BC

bar     LD A,0
Af      EQU $-1
        BIT 0,A
        RET Z
        LD A,C
        Amul8
        LD C,A
Lp_7     PUSH HL
        PUSH BC
Lp_6     LD A,(HL)
        CPL
        LD (HL),A
        INC L
        DJNZ Lp_6
        POP BC
        POP HL
        CALL INC_Y
        DEC C
        JR NZ,Lp_7
        RET

;; DE -> адрес в окне   ; Переместил в ResGUI /DA
;; DE <- адрес на экране
;RealWin_gui
; ...

; Проверяет, попал курсор на прямоугольную област или нэт...

SetINXY LD HL,(ARW_XC)
        LD A,L
        SUB 0
WinX    EQU $-1
        LD L,A
        LD A,H
        SUB 0
WinY    EQU $-1
        LD H,A
        LD (INXY),HL
        RET

LookBox LD DE,0
INXY    EQU $-2
        PUSH HL
        POP IX
lookbox LD A,(IX+0)
        INC E
        CP E
        CCF
        RET C
        ADD A,(IX+2)
        CP E
        RET C
        LD A,(IX+1)
        INC D
        CP D
        CCF
        RET C
        ADD A,(IX+3)
        CP D
        RET


Box_start  ld hl,(BeforeDRW)
           CPHL0
           push ix
           call nz,JPHLgui
           pop ix
Box     LD A,(IX+4)
        LD C,(IX+3)
        LD B,(IX+2)
        LD D,(IX+0)
        LD E,(IX+1)
        CALL SetAtr_gui

        LD DE,0
WinXY   EQU $-2
        CALL RASCH

        BIT 0,(IX+6)
        JR Z,Pass1

        PUSH DE
        EXX

        LD A,(IX+5)
        LD C,2
        LD B,(IX+2)
        LD D,(IX+0)
        LD E,(IX+1)
        CALL SetAtr_gui

        EXX
        PUSH HL
        LD B,(IX+2)
        LD A,#FF
        CALL Lp
        POP HL

        LD C,15
Lp14    CALL INC_Y
        PUSH HL
        LD (HL),%10000000
        INC L
        LD B,(IX+2)
        DEC B
        DEC B
        XOR A
        CALL Lp
        LD (HL),%00000001
        POP HL
        DEC C
        JR NZ,Lp14

        POP DE
        INC E
        INC E
        CALL RASCH
Pass1   PUSH HL
        CALL Lpz
        POP HL
        INC H

        LD (HL),%01111111
        INC L
        LD B,(IX+2)
        DEC B
        DEC B
        LD A,#FF
        CALL Lp
        LD (HL),%11111110

        LD A,(IX+3)
        DEC A
        DEC A
        LD C,A
        Amul8
        SUB 4
        BIT 0,(IX+6)
        JR NZ,Pass3
        ADD A,16
Pass3   LD C,A
Lp_2    CALL INC_Y
        PUSH HL
        LD (HL),%00000010
        DEC L
        XOR A
        CALL Lp_
        LD (HL),%01000000
        POP HL
        DEC C
        JR NZ,Lp_2
        INC H
        LD (HL),%11111110
        DEC L
        CPL
        CALL Lp_
        LD (HL),%01111111
        INC H
Lpz     LD B,(IX+2)
        XOR A
Lp      LD (HL),A
        INC L
        DJNZ Lp
        RET

Lp_     LD B,(IX+2)
        DEC B
        DEC B
lp_     LD (HL),A
        DEC L
        DJNZ lp_
        RET

; HL - adress on screen
; C  - length of SPACE-text

PR_51   LD HL,(xyprn)
pr_51_gui
        LD A,C
        LD (lnprn),A
        AND A
        RET Z
        LD B,FONT/256
        PUSH IX
        LD HX,8
Loop_1  PUSH HL
        LD LX,0
lnprn   EQU $-1
        LD DE,SPACE

Cont    LD A,(DE)
        INC DE
        LD C,A
        LD A,(BC)
        LD (or1+1),A
        DEC LX
        JP Z,Exil

        LD A,(DE)
        INC DE
        LD C,A
        LD A,(BC)
        LD C,A
        XOR A
        DUP 3
        SLA C
        RLA
        EDUP
or1     OR 0
        LD (HL),A
        INC L
        LD A,C
        LD (or2+1),A
        DEC LX
        JP Z,Exil

        LD A,(DE)
        INC DE
        LD C,A
        LD A,(BC)
        RRA
        RRA
or2     OR 0
        LD (or3+1),A
        DEC LX
        JP Z,Exil

        LD A,(DE)
        INC DE
        LD C,A
        LD A,(BC)
        LD C,A
        XOR A
        SLA C
        RLA
or3     OR 0
        LD (HL),A
        INC L
        LD A,C
        LD (or4+1),A
        DEC LX
        JP Z,Exil

        LD A,(DE)
        INC DE
        LD C,A
        LD A,(BC)
        LD C,0
        RRA
        RRA
        RRA
        RR C
        RRA
        RR C
or4     OR 0
        LD (HL),A
        INC L
        LD A,C
        LD (or5+1),A
        DEC LX
        JP Z,Exil

        LD A,(DE)
        INC DE
        LD C,A
        LD A,(BC)
        RRA
or5     OR 0
        LD (or6+1),A
        DEC LX
        JR Z,Exil

        LD A,(DE)
        INC DE
        LD C,A
        LD A,(BC)
        LD C,A
        XOR A
        SLA C
        RLA
        SLA C
        RLA
or6     OR 0
        LD (HL),A
        INC L
        LD A,C
        LD (or7+1),A
        DEC LX
        JR Z,Exil

        LD A,(DE)
        INC DE
        LD C,A
        LD A,(BC)
        RRA
        RRA
        RRA
or7     OR 0
        LD (HL),A
        DEC LX
        JR Z,Exil
        INC L
        JP Cont

Exil    LD (HL),A
Exi     POP HL
        CALL INC_Y
        INC B
        DEC HX
        JP NZ,Loop_1
        POP IX
        RET

Print   LD DE,(WinXY)
        INC D

        LD BC,HEAD0D
        BIT 0,(IX+6)
        JR NZ,Pass2
        LD BC,F0D
        INC E
Pass2   LD (OBROB+1),BC
        CALL RASCH
        LD (xyprn),HL

        LD HL,(TextAdr)
        CPHL0
        RET Z

Jp1_g   LD DE,SPACE
        LD C,0
Lp_3
        ld a,c        ; защита от переполнения /DA
        cp 51
       jr nc,Lp_3.b
        ld a,(hl)
        INC HL
        AND A
       jr nz,1F          ; для корректного выхода по #00 и #FF для адресаций текста /DA
.b      call PR_51
        call f0D_        ; перевод строки для нуля
        ld de,SPACE
        ld c,0
       ret
1       cp #FF
       ret z
        CP #16
       JR Z,SXYP
        CP #0D
       jr nz,1F
OBROB   call F0D
       jr Jp1_g

1       CP #0F
       JR Z,F0F
                       ; обработка дополнительных кодов Print  ; /DA
          cp #0E
        jr nz,1F
          ld a,(hl)    ; #0E,nn - out char number nn
          inc hl
         jr p_chrSV
1         cp #17
        jr z,Prn_TabF  ; #17,x - смещение вывода до позиции X по знакоместам от начальной точки вывода
          cp #0A
       jp z,Pr_atAdr     ;jr ; #0A: DW Addres - вывод текста по адресу (код DB #0A : DW addr)
          cp #0B
        jp z,Pr_pgAddr  ; #0B,Page: DW Addres - вывод строки (без кодов форматирования) из страницы Page (in ResGUI)

p_chrSV
        LD (DE),A
        INC DE
        INC C
       JR Lp_3



SXYP
         push hl      ; выводим что было в буфере /DA
         call PR_51
         pop hl
         ld d,(hl)
        INC HL
         ld e,(hl)
        INC HL
        PUSH HL
        CALL realwin
        CALL RASCH
        LD (xyprn),HL
        POP HL
       jr Jp1_g

F0F     CALL Dline
        JR Jp1_g

HEAD0D  PUSH HL
        LD HL,(xyprn)
        INC H
        INC H
        INC H
        INC H
        CALL pr_51_gui
        LD HL,F0D
.oFOD   LD (OBROB+1),HL
        LD HL,(xyprn)
        CALL INC_YY
        CALL INC_YY
        JR ZZ

f0D_    push hl
       jr 1F
F0D     PUSH HL
        LD HL,0
xyprn   EQU $-2
        CALL pr_51_gui
1       LD HL,(xyprn)
ZZ       ld bc,0    ; swapping 'ld bc,nnnn' to 'ld hl,nnnn' for tab functions ; /DA
xyprn_  EQU $-2      ;
         call INC_YY
        LD (xyprn),HL
        ld a,#01    ; 'ld bc,nnnn'
        ld (ZZ),a
        POP HL
       ret

Prn_TabF                 ; смещение текущего вывода по знакоместам код #17,x   ; /DA
          push hl
          call PR_51
          pop hl
          ld a,(hl)
          ex af,af'
          inc hl
          push hl
          ld a,(ZZ)
          ld hl,(xyprn)
          dec a     ; 1="ld bc,nn"
         jr z,1F
          ld hl,(xyprn_)
1         ld (xyprn_),hl
          ex af,af'
          add a,l
          ld l,a
          ld (xyprn),hl
          ld a,#21       ; ld hl,nnnn
          ld (ZZ),a
          pop hl
         jp Jp1_g

;Pr_atAdr      ; вывод текста по адресу    ; /DA  ; перенёс в резидент ResGUI.asm  /DA  v 3.12


Dline   PUSH HL
        LD HL,(xyprn)
        INC H
        INC H
        INC H
        DEC L
        LD (HL),%01011111
        INC L
        LD B,(IX+2)
        DEC B
        DEC B
        LD A,%11111111
f0f_    LD (HL),A
        INC L
        DJNZ f0f_
        LD (HL),%11111010
        POP HL
        RET

; Обработка горячих клавиш

HotKey  LD A,(DIRECT)
        AND A
        RET NZ

        ld de,.hAdr
        ld hl,(HotBarAdr)
        ld a,h
        or l
       jr z,.hAdr
        ld (hotkey.retZ),de
       jr hotkey.st

.hAdr
        LD HL,(HotAdr)
hotkey_gui
hotkey
        ld de,Ret_gui
        ld (hotkey.retZ),de
.st     ld a,(hl)
        CP #FF              ; не изменять!
       jp z,Ret_gui
.retZ   EQU $-2      ;Addr

        LD DE,(KEYS)
        LD A,D
        OR E
        LD A,#FF
        RET Z

        PUSH HL
        CALL FKEY
        JR NZ,NoFKey
        INC HL
        CALL FKEY
        JR NZ,NoFKey
         push af
         ld a,(Numb)
         inc a
         call nz,BarOff
         pop af
FKey    POP HL
        INC HL
        INC HL
        HLFHL
        LD A,H
        AND A
        JR Z,GOpc
        POP AF
        JP (HL)

GOpc    LD A,L
        LD (Numb),A
        SCF
        RET

NoFKey  POP HL
        LD DE,4
        ADD HL,DE
        JR hotkey.st

REDEF_gui
        CALL #028E
        LD BC,KEYS
        ld a,(WNkeyGui.a_)       ; проверяем код от дополнительных кнопок джойстика
        or a
       jr z,1F
        ld (bc),a
        xor a
        inc bc
        ld (bc),a
       ret
1       PUSH DE
        CALL SKEY
        POP DE
        LD E,D
SKEY    LD A,E
        INC A
        JR Z,ZEROK
        CALL #0347
ZEROK   LD (BC),A
        INC BC
        RET

FKEY    LD A,(KEY1)
        CP (HL)
        RET Z
        LD A,(KEY2)
        CP (HL)
        RET

SaveBack  EQU GETBLK

RestBack  EQU CLOSE

;ExitGui  EQU GUI_EX

TESTRD_gui EQU TESTRD_

RW_gui  EQU RW_

