Resident
        JP GETBLK
        JP CLOSE
        JP SWAP
        JP GUI_EX
        JP TESTRD_     ; , ,   -
        JP RW_         ; BY REALSOFTWARE (  BGE-GUI)

;    / 

GUI     EXX 
        PUSH AF
        LD A,#00
GUI_PAGE EQU $-1
        LD BC,#7FFD
        OUT (C),A
        POP AF
        LD HL,GUI_E
        PUSH HL
        LD (Spp),SP
        LD BC,BeginGUI
        CALL TAB_HL
        PUSH HL
        EXX 
        EX AF,AF'
        RET 

;      !
; (      GUI)

GUI_    EXX 
        LD HL,Ret
        PUSH HL
        LD BC,BeginGUI
        CALL TAB_HL
        PUSH HL
        EXX 
        EX AF,AF'
Ret     RET 

GUI_EX  LD SP,(Spp)
        PUSH DE
GUI_E   PUSH AF
        PUSH BC
        LD A,#10
S_PAGE  EQU $-1
        LD BC,#7FFD
        OUT (C),A
        POP BC
        POP AF
        RET 

SWAP    DI 
        PUSH BC
        LD BC,#7FFD
        OR #10
        OUT (C),A
        POP BC
SWAP2
        PUSH BC
        LD B,#00
SWAP1
        LD C,(HL)
        LD A,(DE)
        EX DE,HL
        LD (HL),C
        LD (DE),A
        EX DE,HL
        INC HL
        INC DE
        DJNZ SWAP1
        POP BC
        DJNZ SWAP2
SET_GUI LD A,(GUI_PAGE)
        LD BC,#7FFD
        OUT (C),A
        EI 
        RET 

CLOSE   CALL ESCAPE
        CALL SET_GUI
        PUSH IX

        LD A,(IX+0)
        LD (xx),A
        LD A,(IX+1)
        LD (yy),A
        LD A,(IX+2)
        LD (ln),A
        LD A,(IX+3)
        LD (hg),A

        CALL OSP
        LD IX,xx

        LD A,(IX+1)
        CALL 3742
        LD A,(IX+0)
        ADD A,L
        LD L,A
        LD DE,(FREE)
        LD A,(IX+3)
        ADD A,A
        ADD A,A
        ADD A,A
        LD C,A
PUTBLK1 LD B,(IX+2)
        PUSH HL
PUTBLK2 LD A,(DE)
        LD (HL),A
        INC DE
        INC HL
        DJNZ PUTBLK2
        POP HL
        CALL DOWN_HL
        DEC C
        JR NZ,PUTBLK1
        PUSH DE
        LD L,(IX+1)
        LD H,0
        LD DE,#5800
        DUP 5
        ADD HL,HL
        EDUP 
        ADD HL,DE
        LD A,(IX+0)
        ADD A,L
        LD L,A
        POP DE
        LD C,(IX+3)
PUTBLK4 PUSH HL
        LD B,(IX+2)
PUTBLK3 LD A,(DE)
        LD (HL),A
        INC HL
        INC DE
        DJNZ PUTBLK3
        POP HL
        PUSH DE
        LD DE,#20
        ADD HL,DE
        POP DE
        DEC C
        JR NZ,PUTBLK4
        CALL CSP
        POP IX
        RET 

xx      DB 0
yy      DB 0
ln      DB 0
hg      DB 0

GETBLK  CALL SAFE
        PUSH IX
        LD A,(IX+0)
        LD (xx),A
        LD A,(IX+1)
        LD (yy),A
        LD A,(IX+2)
        LD (ln),A
        LD A,(IX+3)
        LD (hg),A
        LD IX,xx
        CALL OSP

        LD A,(IX+1)
        CALL 3742
        LD A,(IX+0)
        ADD A,L
        LD L,A
        LD DE,(FREE)
        LD A,(IX+3)
        ADD A,A
        ADD A,A
        ADD A,A
        LD C,A
GETBLK1 LD B,(IX+2)
        PUSH HL
GETBLK2 LD A,(HL)
        LD (DE),A
        INC DE
        INC HL
        DJNZ GETBLK2
        POP HL
        CALL DOWN_HL
        DEC C
        JR NZ,GETBLK1

        LD L,(IX+1)
        LD H,0
        LD BC,#5800
        DUP 5
        ADD HL,HL
        EDUP 
        ADD HL,BC
        LD A,(IX+0)
        ADD A,L
        LD L,A
        LD C,(IX+3)
GETBLK4 PUSH HL
        LD B,(IX+2)
GETBLK3 LD A,(HL)
        LD (DE),A
        INC HL
        INC DE
        DJNZ GETBLK3
        POP HL
        PUSH DE
        LD DE,#20
        ADD HL,DE
        POP DE
        DEC C
        JR NZ,GETBLK4
        LD (FREE),DE
        CALL CSP
        POP IX
        RET 

OSP     LD A,#00
STORE_PAGE EQU $-1
OSP1    OR #10
        LD BC,#7FFD
        OUT (C),A
        RET 
CSP     LD A,(GUI_PAGE)
        JR OSP1

DOWN_HL INC H
        LD A,H
        AND 7
        RET NZ
        LD A,L
        ADD A,#20
        LD L,A
        RET C
        LD A,H
        SUB #08
        LD H,A
        RET 

SAFE
        LD HL,(STACK_P)
        PUSH IX
        POP DE
        LD (HL),E
        INC HL
        LD (HL),D
        INC HL
        LD DE,(FREE)
        LD (HL),E
        INC HL
        LD (HL),D
        INC HL
        LD (STACK_P),HL
        RET 

ESCAPE  LD HL,(STACK_P)
        DEC HL
        LD D,(HL)
        DEC HL
        LD E,(HL)
        DEC HL
        LD (FREE),DE
        LD D,(HL)
        DEC HL
        LD E,(HL)
        LD (STACK_P),HL
        PUSH DE
        POP IX
        RET 

FREE    DEFW #C000  ;     #C000
STACK_P DEFW STACK  ;  -
STACK   DEFS #20    ;  #20/2=16 

GETjp   PUSH AF
        LD A,(GUI_PAGE)
        LD BC,#7FFD
        OUT (C),A
        POP AF
        LD BC,BeginGUI
        CALL TAB_HL
        LD A,(S_PAGE)
        LD BC,#7FFD
        OUT (C),A
        RET 

;  -  
ERASE_ALLW
        LD HL,#C000
        LD (FREE),HL
        LD HL,STACK
        LD (STACK_P),HL
        RET 

;  (. )   
CLOSE_ALLW
        LD HL,(FREE)
        LD DE,#C000
        AND A
        SBC HL,DE
        RET Z
        CALL CLOSE
        JR CLOSE_ALLW

TAB_HL  LD H,0
        LD L,A
        ADD HL,HL
        ADD HL,BC
        HLFHL
        RET 

RESLEN=$-GUI

;   Gfx User Interface

SpDrive EQU #D8BA

Window       EQU 0
Win          EQU Window+1
Winn         EQU Win+1
Filer        EQU Winn+1
DOS_FUNC     EQU Filer+1
FDOS         EQU DOS_FUNC+1
GET_NUM      EQU FDOS+1
PUTARW       EQU GET_NUM+1
GETARW       EQU PUTARW+1
DIRSCN       EQU GETARW+1
EDIT         EQU DIRSCN+1
SL_BANK      EQU EDIT+1
NOKEY        EQU SL_BANK+1
WAITKEY      EQU NOKEY+1
REDEF        EQU WAITKEY+1
MOVES        EQU REDEF+1
RAMKA        EQU MOVES+1
ARW_SCN      EQU RAMKA+1
BUTTON       EQU ARW_SCN+1
Spisok       EQU BUTTON+1
Filer_       EQU Spisok+1
SORT         EQU Filer_+1
pr_51        EQU SORT+1
FormExt      EQU pr_51+1
LOAD_CAT     EQU FormExt+1
STOP_ARW     EQU LOAD_CAT+1
IniAdr       EQU STOP_ARW+1
PUT_INT      EQU IniAdr+1
GET_INT      EQU PUT_INT+1
ASCII        EQU GET_INT+1
HOT_KEY      EQU ASCII+1
ARW_NEW      EQU HOT_KEY+1
ARW_OLD      EQU ARW_NEW+1
GET_MSG      EQU ARW_OLD+1
TEST         EQU GET_MSG+1

        INCLUDE "RDrive",#8E

