

BoxPgn
        DISP PgnAdr

EBOX    ld (.spp),sp
        call SV_UNDO
.Lbox   ld a,%1111
.ebox   ld ix,WBox
        ld (ix+6),a
        ld sp,0
.spp    EQU $-2
        call Win_
        cp #FF
       jp z,CLOSE
        cp 8              ; количество опций до черты
       jr c,2F
       jr nz,.ebox_
         ld a,%1110
         ld ix,WMBox
          ld (ix+6),a
         call Win_
         cp 4
        jr nc,1F
         push af
         add a,a
         add a,a
         ld b,0
         ld c,a
         ld hl,WMBox.TMBox
         add hl,bc
         ld de,WBox.TmBox
         ld bc,3
         ldir
         pop af
         ld c,a   ; b=0
         ld hl,.cTBox
         add hl,bc
         ld a,(hl)
         ld (.mod_Box),a
1        call CLOSE
.ebox_
        ld a,%1101
       jr .ebox
2       push af
        call EraseAllw
        call LOADSCR
        call P_strt
        call NOKEY_
        call .but2ms
        pop af
        ld bc,.TBBox
        call TAB_HL
        ld (.ADDR_use),hl
        call .useBox
        call ReWin
       jr .Lbox


.cTBox   nop          ; put
         or (hl)      ; or
         xor (hl)     ; xor
         and (hl)     ; and

.TBBox  DW .Tek_Box
        DW .Cls_Box
        DW .Inv_Box
        DW .InC_Box
        DW .Rev_Box
        DW .Cop_Box
        DW .Co_Box
        DW .Pag_Box

.useBox               ; Выбор и использование ячейки
              xor a
              ld (.selBfl),a
              ld (.usespp),sp
.Luseb         ld a,(WBox.Mbut2)
               or a
               ld a,ArrCancel_Y
              jr z,1F
               ld a,ArrCancel_N
1              call GUI
              ld a,%1000
              ld ix,.WselBox
              ld (ix+6),a
              ld sp,0
.usespp      EQU $-2
              call Win_
              push af
              call .resBfl       ; стирание коробки
           ;   ld a,ArrCancel_Y
           ;   call GUI
              call SV_ADEF.arr  ; вместо => ld a,ArrCancel_Y : call GUI
              pop af
              cp #FF
             jp z,SAVESCR
              call .useb1
             jr .Luseb

.useb1        or a
             jr z,.useRGB
              dec a
             jp z,Col
              call SAVESCR
              call SwapSCRS            ; swap screens
              call P_strt
             jp LOADSCR



.useRGB       call PRGB2
.but2ms       ld a,(WBox.Mbut2)
              or a
             jr z,1F
              ld a,#20
1             ld (.mbt4),a
              ld a,(WBox.ColFL)
              or a
              ld a,#C9         ; a=[ ret ]
             jr z,1F
              ld a,#25         ; a=[ dec h ]
1             ld (.RetDec0),a
              ld (.RetDec1),a
              ld (.RetDec2),a

             ret

.WselBox  DB 0,0,32,24,0,0,%1000
          DB 0
          DW Nil          ; объект-текст
          DW Nil          ; объект-подсветка (выборка)
          DW .HselBut     ; горячие клавиши
          DW #0005        ; пропуск адресов
          DW .selINT      ; вызов на "прерываниях"
          DW #FFFF

.HselBut  DB "C",0           ; C - RGB Colour
            DW 0
          DB "K",0           ; K - miniRGB
            DW 1
          DB "L",0           ; L - swap screens
            DW 2
          DB "S",0           ; S - swap screens
            DW 2

          DB #FF



.selINT       ld a,(BRK)
              ld c,0
              cp 6              ; %110
             jr nz,1F
              ld c,#20
.mbt4  EQU $-1
1             ld a,(DIRECT)
              or c
              push af
              call .mvBox
              pop af
              ld c,a
              or a
             jr nz,1F
              ld (.fl_keys),a
1             and #30
             jr nz,1F
              ld (.fl_mv_fr),a
1             ld a,0
.fl_keys     EQU $-1
              or 0
.fl_new      EQU $-1
             ret nz
              ld a,c
              and #30
             ret z
              ex af,af'
              call .resBfl
              ex af,af'
              ld hl,(.selADDR)    ; адрес выбранной ячейки
              ld b,8              ; на всякий
              and #10
             jr nz,1F
              call .uselect     ; выставляет флаг Z на выходе
             jr 2F
1             call Ret
.ADDR_use    EQU $-2      ; Адрес перехода для опции
2             call Ret_guiPG   ; at ResGUI
             jp .setBox

.mvBox           ; рисует и перемещает рамку за стрелкой  ; in a = (DIRECT)
              ld hl,0
.last      EQU $-2
.mvBox__      ld de, (ARW_XC)
           ;   ld c,a          ; c = (DIRECT)
            ;   bit 4,c
              and #30
             jr z, 1F
              ld a,0
.fl_mv_fr  EQU $-1            ; флаг для файра
              or a
             jr nz,1F
              cpl
              ld (.fl_mv_fr),a
              xor a
             jr 2F

1             xor a
              sbc hl,de
             jr nz,2F

              ld a,#FF         ; не меняем флаг z
2             ld (.fl_new),a
              ld (.last),de
              push de
              call nz,.resBfl
              pop de
              ld a,(.selBfl)
              or a
             ret nz
              call RASCH_
              ld (.selADDR),hl
             jr .setBox
.resBfl       ld a,(.selBfl)
              or a
             ret z
.setBox       ld a,0
.selBfl  EQU $-1     ; флаг нарисована ли рамка
              cpl
              ld (.selBfl),a
              ld hl,0
.selADDR   EQU $-2
              ld a,#FF
              xor (hl)
              ld (hl),a
              inc h
              ld b,6
1              ld a,#81
               xor (hl)
               ld (hl),a
               inc h
             djnz 1B
              ld a,#FF
              xor (hl)
              ld (hl),a
             ret

.hbyteC        ld a,h
               rrca
               rrca
               rrca
               and #03
               or #58
               ld h,a   ; hl color addr
              ret


.Pag_Box       ld c,#17
               ld a,(.mod_Box)
              jr 1F
.uselect       xor a
               ld c,SuxPage|#10
1              ld (.mod_uBox),a
               ld a,c
               call Ram

               ld d,h
               ld e,l

               set 7,d
               ld b,8
1              ld a,(de)
.mod_uBox      nop             ; nop / or (hl) /xor (hl) /and (hl)
               ld (hl),a
               inc h
               inc d
              djnz 1B
.RetDec0       dec h         ; dec h / ret   ; color
               ld a,h
               rrca
               rrca
               rrca
               and #03
               or #58
               ld h,a
               or #80
               ld d,a
               ld a,(de)
               ld (hl),a
               ret



.Cls_Box       xor a
1              ld (hl),a
               inc h
              djnz 1B
.RetDec1       dec h              ; dec h / ret
.Tek_Box       call .hbyteC
               ld a,(hl)
               call MIXCOL
               ld (hl),a
              ret

.Inv_Box
1              ld a,(hl)
               cpl
               ld (hl),a
               inc h
              djnz 1B
               ret

.Rev_Box       call .Inv_Box
               dec h
.InC_Box       call .hbyteC
               ld a,(hl)
               ld b,a
               and 7
               add a,a
               add a,a
               add a,a
               ld c,a
               ld a,b
               and #C0
               or c
               ld c,a
               ld a,b
               rra
               rra
               rra
               and 7
               or c
               ld (hl),a
              ret

.Cop_Box        ld de,.pt_Box
               jr 1F
.Co_Box         ld de,.put_Box
1               ld (.ADDR_use),de
                ld de,BUFF
1               ld a,(hl)
                ld (de),a
                inc h
                inc de
               djnz 1B
                dec h
                call .hbyteC
                ld a,(hl)
                ld (de),a
1               ld a,#FF
                ld (.fl_keys),a
               ret
.pt_Box         call .put_Box
                ld hl,.Cop_Box
                ld (.ADDR_use),hl
               jr 1B
.put_Box        ld de,BUFF
1               ld a,(de)
.mod_Box        nop             ; nop / or (hl) /xor (hl) /and (hl)
                ld (hl),a
                inc de
                inc h
               djnz 1B
.RetDec2        dec h            ; dec h / ret
                call .hbyteC
                ld a,(de)
                ld (hl),a
               ret




WBox   ; DB 20,2,11,16,5*8,5,%00001111
        DB 9,2,11,16,5*8,5,%00001111
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
        DEFB 0
        DEFW .TBox         ; объект-текст
        DEFW .SBox         ; объект-подсветка (выборка)
        DW #0002          ; пропуск 2-х адресов
        DW .Flags         ; объект флажки
        DEFW #FFFF

.Flags  DB 8,13,9,0    ; флажек цвета
.ColFL EQU $-1
         DW Nil
        DB 8,14,10,0    ; флажек 2 кнопки мыши
.Mbut2 EQU $-1
         DW Nil
        DB #FF

.TBox
        MSG_BOX_Head : DB 13
        MSG_BOX_CurrCol : DB 13
        MSG_BOX_Clear : DB 13
        MSG_BOX_Inv : DB 13
        MSG_BOX_InvCol : DB 13
        MSG_BOX_Reverse : DB 13
        MSG_BOX_Copy : DB 13
        MSG_BOX_CopyP : DB 13
        MSG_BOX_Scr2 : DB 13
        DB 15,13
        MSG_BOX_Mode : DB #17,7

.TmBox  DB "Put",13
        MSG_WIN_Color : DB 13
        MSG_2Mbut : DB 0

.SBox    DB 1,3,9,128+8,%11
        DB 1,12,9,128+3,%11
        DB #FF




WMBox   DEFB 20,2,4,6,7*8,7,%00001110
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
        DEFB 0
        DEFW .TMBox        ; объект-текст
        DEFW .SMBox        ; объект-подсветка (выборка)
        DEFW #FFFF

.TMBox  DB "Put",13
        DB "Or ",13
        DB "Xor",13
        DB "And",0

; x, y, длина, высота, флаг
; bit 0 - подсвечивать (да/нет)
; bit 1 - клавиша "заморожена"

.SMBox
        DB 1,1,2,128+4,%11
        DEFB #FF








;====================================================================

PREPARATION:
        CALL    COORDS_EXCHANGE
EL_PRE01 LD      A,B
        ADD     A,D
        RRA
        LD      B,A
        LD      A,C
        ADD     A,E
        RRA
        LD      C,A
        LD      A,D
        SUB     B
        JR      Z,L49847
        DEC     A
L49847  LD      D,A
        LD      A,E
        SUB     C
        JR      Z,L49853
        DEC     A
L49853  LD      E,A
        RET

COORDS_EXCHANGE:

        LD      A,D
        CP      B
        JR      NC,C_EX01
        LD      D,B
        LD      B,A
C_EX01  LD      A,E
        CP      C
        RET     NC
        LD      E,C
        LD      C,A
        RET

ELLIPSE_BODY:
        LD      A,E
        CP      D
        JR      Z,CIRCLE_BODY
        JR      C,L51118

        LD      HL,L51085
        LD      E,D
        LD      D,A
        LD      (L51282),HL
        LD      HL,L51091
        JR      L51_2

L51118  LD      HL,L51091
        LD      (L51282),HL
        LD      HL,L51085

L51_2   LD      (L51179),HL
        LD      (L51318),HL
        LD      L,E
        LD      E,D
        CALL    L51060
        LD      A,205           ; CALL nn
        JR      L51143

CIRCLE_BODY:
        LD      D,A
        LD      A,33            ; LD HL,nn
L51143  LD      (L51178),A
        LD      (L51281),A
        LD      (L51317),A
        LD      A,D
        OR      A
        JP      Z,L50071
        INC     A
        LD      (L51279),BC
        LD      (L51293),BC
        LD      (L51315),BC
        LD      (L51329),BC
        LD      LX,A
        DEC     A
        LD      E,A
        PUSH    IX

L51178  LD      HL,L51091 ; CALL    L51091
L51179  EQU     $-  2

        POP     IX
        LD      A,D
        ADD     A,B
        LD      B,A
        CALL    L50071
        LD      A,B
        SUB     D
        SUB     D
        LD      B,A
        CALL    L50071
        LD      A,B
        ADD     A,D
        LD      B,A
        LD      A,C
        ADD     A,E
        LD      C,A
        CALL    L50071
        LD      A,C
        SUB     E
        SUB     E
        LD      C,A
        CALL    L50071
        LD      D,0
        LD      H,D
        LD      L,D
        LD      E,LX
        LD      IX,255
L51222  INC     D
        LD      C,D
        LD      B,0
        ADD     HL,BC
        LD      A,H
        ADD     A,A
        JR      NZ,L51222
        PUSH    HL
        ADD     HL,HL
        ADD     HL,HL
        XOR     A
        LD      B,A
        LD      C,E
        SBC     HL,BC
        POP     HL
        JR      C,L51222
        LD      B,0
        LD      C,E
        SBC     HL,BC
        DEC     E
        PUSH    HL
        CALL    L51261
        POP     HL
        LD      LX,D
        XOR     A
        XOR     HX
        JR      Z,L51222
        RET
L51261  INC     LX
        LD      A,LX
        CP      E
        JR      Z,L51275
        LD      A,E
        CP      D
        JR      NC,L51275
        LD      HX,D
        RET
L51275  PUSH    DE
        PUSH    IX
        LD      BC,18774
L51279  EQU     $-  2
L51281  LD      HL,L51085 ; CALL    L51085
L51282  EQU     $-  2
        LD      A,B
        ADD     A,E
        LD      B,A
        PUSH    DE
        CALL    L50656
        POP     DE
        LD      BC,18774
L51293  EQU     $-  2
        LD      A,B
        SUB     E
        LD      B,A
        CALL    L50656
        POP     IX
        POP     DE
        LD      A,D
        CP      E
        JR      NZ,L51311
        CP      LX
        RET     Z
L51311  PUSH    DE
        PUSH    IX
        LD      BC,18774
L51315  EQU     $-  2
L51317  LD      HL,L51091 ; CALL    L51091
L51318  EQU     $-  2
        LD      A,C
        ADD     A,E
        LD      C,A
        PUSH    DE
        CALL    L50757
        POP     DE
        LD      BC,18774
L51329  EQU     $-  2
        LD      A,C
        SUB     E
        LD      C,A
        CALL    L50757
        POP     IX
        POP     DE
        RET

L51085  LD      A,E
        CALL    L51038
        LD      E,A
        RET
L51091  LD      A,LX
        CALL    L51038
        LD      LX,A
        LD      A,D
        CALL    L51038
        LD      D,A
        RET

L50071  CALL    L51011
        RLCA
        RLCA
        RLCA
        CPL
        AND     56
        OR      199
        LD      (L50087),A
        XOR     A
        SET     6,A
L50087  EQU     $-  1
E_SET01  XOR     (HL)     ; OR/XOR
        LD      (HL),A
        CALL    SET_COLOUR
        RET

L50656  PUSH    BC
        PUSH    DE
        LD      A,C
        SUB     D
        EX      AF,AF'
        LD      A,C
        SUB     LX
        LD      D,A
        EX      AF,AF'
        LD      C,A
        CALL    L50681
        POP     DE
        POP     BC
        LD      A,C
        ADD     A,D
        LD      D,A
        LD      A,C
        ADD     A,LX
        LD      C,A
        LD      A,83
L50680  EQU     $-  1
L50681  LD      A,D
        CP      C
        JR      NC,L50687
        LD      D,C
        LD      C,A
L50687  LD      A,C
        AND     #F8
        LD      E,A
        LD      A,D
        AND     #F8
        CP      E
        JR      NZ,L50726
        CALL    L51011
        LD      B,A
        LD      A,255
        JR      Z,L50709
L50705  SRL     A
        DJNZ    L50705
L50709  LD      C,A
L50710  LD      A,D
        AND     7
        LD      B,A
        LD      A,128
        JR      Z,L50722
L50718  SCF
        RRA
        DJNZ    L50718
L50722  AND     C
E_SET02 XOR     (HL)    ; OR/XOR
        LD      (HL),A
        CALL    SET_COLOUR
        RET

L50726  SUB     E
        RRCA
        RRCA
        RRCA
        LD      E,A
        CALL    L51011
        LD      B,A
        LD      A,255
        JR      Z,E_SET03
L50739  SRL     A
        DJNZ    L50739
E_SET03  XOR     (HL)      ; OR/XOR
        LD      (HL),A
        CALL    SET_COLOUR
        LD      B,C
        LD      C,255
L50748  INC     L
        DEC     E
        JR      Z,L50710
        LD      A,(HL)
E_SET04 CPL             ; OR/XOR !!!
        LD      (HL),A
        CALL    SET_COLOUR
        JR      L50748

L50757  PUSH    BC
        PUSH    DE
        LD      A,B
        SUB     D
        EX      AF,AF'
        LD      A,B
        SUB     LX
        LD      D,A
        EX      AF,AF'
        LD      B,A
        CALL    L50780
        POP     DE
        POP     BC
        LD      A,B
        ADD     A,D
        LD      D,A
        LD      A,B
        ADD     A,LX
        LD      B,A
L50780  LD      A,D
        CP      B
        JR      NC,L50786
        LD      D,B
        LD      B,A
L50786  LD      A,D
        SUB     B
        RET     C
        INC     A
        LD      D,A
        CALL    L51011
        RLCA
        RLCA
        RLCA
        CPL
        AND     56
        OR      195
        LD      (L50808),A
        LD      E,0
        SET     6,E
L50808  EQU     $-  1
        LD      A,B
L50810  CPL
        AND     7
        INC     A
        LD      B,A
L50815  LD      A,(HL)
E_SET05 XOR     E       ; OR/XOR
        LD      (HL),A
        CALL    SET_COLOUR
        INC     H
        DEC     D
        RET     Z
        DJNZ    L50815
        LD      B,8
        LD      A,32
        ADD     A,L
        LD      L,A
        JR      C,L50815
        LD      A,#F8
        ADD     A,H
        LD      H,A
        JR      L50815
        LD      A,D
        CP      B
        JR      NC,L50846
        LD      D,B
        LD      B,A
        LD      A,E
        LD      E,C
        LD      C,A
L50846  LD      A,C
        CP      E
        SBC     A,A
        AND     8
        LD      L,45            ; DEC L
        JR      Z,L50856
        DEC     L               ; INC L
L50856  INC     A
        LD      (L50925),A
        LD      (L50975),A
        LD      A,L
        LD      (L50935),A
        LD      (L50990),A
        CALL    L51011
        RLCA
        RLCA
        RLCA
        CPL
        OR      199
        LD      (L50895),A
        LD      A,D
        SUB     B
        LD      D,A
        LD      A,E
        SUB     C
        LD      E,A
        JR      NC,L50893
        NEG
        LD      E,A
L50893  XOR     A
        SET     3,A
L50895  EQU     $-  1
        LD      C,A
        LD      A,E
        CP      D
        JR      NC,L50952
        LD      B,D
        INC     B
        LD      A,E
        SUB     D
        LD      E,A
        XOR     A
        XOR     D
        RRA
L50909  EX      AF,AF'
        LD      A,C
        CALL    E_SET01
        INC     H
        LD      A,H
        AND     7
        JR      Z,L50939
L50920  EX      AF,AF'
        ADD     A,E
        JR      NC,L50931
        RLC     C
L50925  EQU     $-  1
        JR      C,L50935
        DJNZ    L50909
        RET
L50931  ADD     A,D
        DJNZ    L50909
        RET
L50935  DEC     L
        DJNZ    L50909
        RET

L50939  LD      A,32
        ADD     A,L
        LD      L,A
        JR      C,L50920
        LD      A,#F8
        ADD     A,H
        LD      H,A
        JP      L50920
L50952  LD      B,E
        INC     B
        LD      A,E
        SUB     D
        LD      D,A
        XOR     A
        XOR     E
        RRA
        EX      AF,AF'
        JR      L50970

L50963  EX      AF,AF'
        INC     H
        LD      A,H
        AND     7
        JR      Z,L50998
L50970  LD      A,C
        CALL    E_SET01
        RLC     C
L50975  EQU     $-  1
        JR      C,L50990
        EX      AF,AF'
        SUB     D
        JR      C,L50985
        DJNZ    L50963
        RET
L50985  ADD     A,E
        EX      AF,AF'
        DJNZ    L50970
        RET
L50990  DEC     L
        EX      AF,AF'
        SUB     D
        JR      C,L50985
        DJNZ    L50963
        RET
L50998  LD      A,32
        ADD     A,L
        LD      L,A
        JR      C,L50970
        LD      A,#F8
        ADD     A,H
        LD      H,A
        JP      L50970

L51011  LD      A,B
        AND     A
        RRA
        SCF
        RRA
        AND     A
        RRA
        XOR     B
        AND     #F8
        XOR     B
        LD      H,A
        LD      A,C
        RLCA
        RLCA
        RLCA
        XOR     B
        AND     199
        XOR     B
        RLCA
        RLCA
        LD      L,A
        LD      A,C
        AND     7
        RET


L51038  PUSH    BC
        PUSH    DE
        PUSH    HL
        LD      DE,162
L51042  EQU     $-  2
        LD      B,8
        LD      H,D
        LD      L,D
L51048  ADD     HL,HL
        ADD     A,A
        JR      NC,L51053
        ADD     HL,DE
L51053  DJNZ    L51048
        LD      A,H
        POP     HL
        POP     DE
        POP     BC
        RET


L51060  PUSH    BC
        PUSH    DE
        LD      B,9
        XOR     A
        LD      H,A
        LD      D,A
L51067  AND     A
        SBC     HL,DE
        CCF
        JR      C,L51075
        ADD     HL,DE
        AND     A
L51075  ADC     A,A
        ADD     HL,HL
        DJNZ    L51067
        LD      (L51042),A
        POP     DE
        POP     BC
        RET

SET_COLOUR:
        NOP

; ЕСЛИ СМЕНА АТРИБУТОВ НЕ НУЖНА - ЭТУ
; ПРОЦЕДУРУ, А ТАКЖЕ ВСЕ К НЕЙ ОБРАЩЕНИЯ
; МОЖНО УБРАТЬ.

        LD      A,H
        RRCA
        RRCA
        RRCA
        AND     3
        OR      88
        PUSH    HL,DE
        LD      H,A
        LD A,(HL)
        CALL MIXCOL
elcol   LD (HL),A
        POP     DE,HL
        RET


;==============================================================

        ENT
LBox=$-BoxPgn

        DISPLAY "Box len   :",/a,LBox
