; New code for select box v3.12

BoxCol
RAMKA_       push hl,de,bc
              call RAMKA_gui
             pop bc,de,hl
            ret

Ramka        call RAMKA_       ; для работы в странице GUI
            jp guiRAM

hlde_minmax_  ld a,h       ; нормирует точки рамки по левый верх DE , правый низ HL
              cp d
             jr nc,1F
              ld h,d
              ld d,a
1             ld a,l
              cp e
             ret nc
              ld l,e
              ld e,a
             ret

hlde_mm_bc_   call hlde_minmax_

bc_hldesize   ld a,h     ; получаем размер-1  в BC ,  fl c for error
              sub d
              ld b,a
             ret c
              ld a,l
              sub e
              ld c,a
             ret

debc_IX_      ld e,(ix+0)
              ld d,(ix+1)
              ld c,(ix+2)
              ld b,(ix+3)
             ret

IX_debc_    ld (ix+0),e
            ld (ix+1),d
            ld (ix+2),c
            ld (ix+3),b
           ret

debc_x8_     ld a,e
1            add a,a
             add a,a
             add a,a
             ld e,a
             ld a,d
1            add a,a
             add a,a
             add a,a
             ld d,a
             ld a,c
1            add a,a
             add a,a
             add a,a
             dec a
             ld c,a
             ld a,b
1            add a,a
             add a,a
             add a,a
             dec a
             ld b,a
             xor a
            ret


RAMKA_gui
             call debc_IX_
             call debc_x8_
            jr BoxPixLU


;FRamka        call INILH
BoxPix        call debc_IX_
             jr BoxPixLU


; Настройка длины исходя из max/min      из 'FRamka.asm'
;INILH

;         ld a,d
;         cp b
;        jr c,1F
;         ld a,b
;         ld b,d
;1        ld (X1),a
;         ld a,b
;         ld (X2),a

;         ld a,e
;         cp c
;        jr c,1F
;         ld a,c
;         ld c,e
;1        ld (Y1),a
;         ld a,c
;         ld (Y2),a

;    ;    LD A,(Y2)
;Y2  EQU $+1 : ld a,0
;        LD (IX+0),A
;    ;    LD A,(X2)
;X2  EQU $+1 : ld a,0
;        LD (IX+1),A
;        LD A,(Y2)
;        LD B,A
;    ;    LD A,(Y1)
;Y1  EQU $+1 : ld a,0
;        SUB B
;        LD (IX+2),A
;        LD A,(X2)
;        LD B,A
;    ;    LD A,(X1)
;X1  EQU $+1 : ld a,0
;        SUB B
;        LD (IX+3),A
;        RET

BoxCol12    ; in:  DE: E=X col , D=Y col ; HL: L=X1 , H=X2
              call hlde_mm_bc_
             ret c
              inc b
              inc c
              call debc_x8_  ; получили параметры для BoxPixLU
             jr BoxPixLU


BoxPix12    ; in:  DE: E=X pixels , D=Y pixels ; HL: L=X1 , H=X2
              call hlde_mm_bc_   ; получили параметры для BoxPixLU
             ret c
             jr BoxPixLU
           ; --VVV--



BoxCol8x8pxLU   ld l,#F8   ; прорисовка квадратика в 1 знакоместо
                ld a,e     ; для минилинзы в адресации
                and l
                ld e,a
                ld a,d
                and l
                ld d,a
                ld bc,#0707

;  Прорисовка рамки  вход:
; DE: E=X pixels , D=Y pixels ; BC: C=dx-1 pixels , B=dy-1 pixels

BoxPixLU      push de,bc     ; прорисовка рамки с вершиной слева-верх
              ld a,e         ; прорисовка верхней линии
              and 7
              ld b,a
              call PixHLaM
              push af
              push hl
              call pnkt_Lr
              pop hl
              pop af
              pop bc,de
              push de,bc     ; прорисовка левой линии
              ld c,a
              call pnkt_Ud
              pop bc,de
              push de,bc
              ld a,c         ; прорисовка правой линии
              or a
             jr z,1F         ; линии совпадают
              add a,e
              ld e,a
             jr c,1F          ; нет правой линии
              call PixHLaM
              ld c,a
              call pnkt_Ud
1             pop bc,de
              ld a,b         ; прорисовка нижней линии
              or a
             ret z           ; линии совпадают
              add a,d
              ld d,a
             ret c
.ld_          cp 192
             ret nc
              ld a,e
              and 7
              ld b,a
              call PixHL
              call pnkt_Lr
             ret


BoxPixRU      push de,bc     ; прорисовка рамки с вершиной право-верх
              ld a,e         ; прорисовка верхней линии
              and 7
              ld b,a
              call PixHLaM
              push af
              push hl
              call pnkt_Rl
              pop hl
              pop af
              pop bc,de
              push de,bc     ; прорисовка правой линии
              ld c,a
              call pnkt_Ud
              pop bc,de
              push de,bc
              ld a,e         ; прорисовка левой линии
              sub c
             jr c,1F          ; нет левой линии
              cp e
             jr z,1F          ; линии совпадают
              ld e,a
              call PixHLaM
              ld c,a
              call pnkt_Ud
1             pop bc,de
              ld a,b         ; прорисовка нижней линии
              or a
             ret z           ; линии совпадают
              add a,d
              ld d,a
             ret c
.rd_          cp 192
             ret nc
              ld a,e
              and 7
              ld b,a
              call PixHL
              call pnkt_Rl
             ret


BoxPixLD      push de,bc     ; прорисовка рамки с вершиной  лево-низ
              ld a,e         ; прорисовка нижней линии
              and 7
              ld b,a
              call PixHLaM
              push af
              push hl
              call pnkt_Lr
              pop hl
              pop af
              pop bc,de
              push de,bc     ; прорисовка левой линии
              ld c,a
              call pnkt_Du
              pop bc,de
              push de,bc
              ld a,c         ; прорисовка правой линии
              or a
             jr z,1F         ; линии совпадают
              add a,e
              ld e,a
             jr c,1F          ; нет правой линии
              call PixHLaM
              ld c,a
              call pnkt_Du
1             pop bc,de
              ld a,d         ; прорисовка верхней линии
              sub b
             ret c
              cp d
             ret z           ; линии совпадают
              ld d,a
             jp BoxPixLU.ld_


BoxPixRD      push de,bc     ; прорисовка рамки с вершиной право-низ
              ld a,e         ; прорисовка нижней линии
              and 7
              ld b,a
              call PixHLaM
              push af
              push hl
              call pnkt_Rl
              pop hl
              pop af
              pop bc,de
              push de,bc     ; прорисовка правой линии
              ld c,a
              call pnkt_Du
              pop bc,de
              push de,bc
              ld a,e         ; прорисовка левой линии
              sub c
             jr c,1F          ; нет левой линии
              cp e
             jr z,1F          ; линии совпадают
              ld e,a
              call PixHLaM
              ld c,a
              call pnkt_Du
1             pop bc,de
              ld a,d         ; прорисовка верхней линии
              sub b
             ret c
              cp d
             ret z           ; линии совпадают
              ld d,a
             jp BoxPixRU.rd_


; прорисовка горизонтальной линии слева
; HL - addres , B - number bit in addres , C - length-1

pnkt_Lr          ld a,h
                 or a
                ret z
                 ld e,%10011001
                 ld d,b

                 ld a,b
                 or a
                 ld a,#FF
                jr z,2F
1                or a : rra
                djnz 1B
2                ld (.m1bt),a    ; маска 1-го байта
                 ld a,d
                 inc a
                 add a,c
                 and #07
                 ld b,a
                 ld a,#00
                jr z,2F
                 dec a
1                or a : rra
                djnz 1B
2                ld (.m2bt),a        ; обратная маска последнего байта

                 ld a,8
                 sub d
                 ld b,a         ; количество точек в 1-м байте
                 ld d,#1F

.m1bt EQU $+1 :  ld a,#FF
                 and e
                 xor (hl)
                 ld (hl),a
                 ld a,c
                 sub b
                jr c,5F          ; снимаем остаток рамки


3                ld b,8
4                ld c,a
.lp0             inc l
                 ld a,l
                 and d
                ret z          ; exit - вышли за экран
                 ld a,e
                 xor (hl)
                 ld (hl),a
                 ld a,c
                 sub b
                jr nc,4B
5                ld a,#00
.m2bt  EQU $-1
                 and e
                 xor (hl)
                 ld (hl),a        ; снимаем остаток рамки
                ret

; прорисовка горизонтальной линии справа
; HL - addres , B - number bit in addres , C - length-1

pnkt_Rl          ld a,h
                 or a
                ret z
                 ld e,%10011001
                 ld d,b

                 xor a
                 inc b
1                scf : rra
                djnz 1B
2                ld (.m1bt),a    ; маска 1-го байта
                 ld a,d
                 sub c
                 and #07
                 ld b,a
                 ld a,#FF
                jr z,2F
                 inc a
1                scf : rra
                djnz 1B
2                ld (pnkt_Lr.m2bt),a   ; ld (.m2bt),a   ; обратная маска последнего байта

                 ld b,d         ; количество точек в 1-м байте
                 ld d,#E0

.m1bt EQU $+1 :  ld a,#FF
                 and e
                 xor (hl)
                 ld (hl),a
                 ld a,c
                 sub b
                jr c,5B         ; снимаем остаток рамки

3                ld b,8
4                ld c,a
.lp0             dec l
                 ld a,l
                 or d
                 inc a
                ret z           ; exit - вышли за экран
                 ld a,e
                 xor (hl)
                 ld (hl),a
                 ld a,c
                 sub b
                jr nc,4B
;5                ld a,#00
;.m2bt  EQU $-1
;                 and e
;                 xor (hl)
;                 ld (hl),a        ; снимаем остаток рамки
;                ret
                jr 5B


; прорисовка вертикальной линии сверху-вниз
; HL - addres , C - code bit in addres , B - length-1

pnkt_Ud         ld a,h
                or a
               ret z
              ; пропускаем первый и последний пиксель
                inc b
                dec b
               ret z
                dec b
               ret z

1               call INC_Y
                ld a,h
                cp #58
               ret nc
                dec b            ; -
               ret z

                call INC_Y
                ld a,h
                cp #58
               ret nc
                dec b            ; -
               ret z

                call INC_Y
                ld a,h
                cp #58
               ret nc
                ld a,c           ; +
                xor (hl)
                ld (hl),a
                dec b
               ret z

                call INC_Y
                ld a,h
                cp #58
               ret nc
                ld a,c           ; +
                xor (hl)
                ld (hl),a
               djnz 1B
               ret



; прорисовка вертикальной линии снизу-вверх
; HL - addres , C - code bit in addres , B - length-1

pnkt_Du         ld a,h
                or a
               ret z
               ; пропускаем первый и последний пиксель
                inc b
                dec b
               ret z
                dec b
               ret z

1               call DEC_Y
                ld a,h
                cp #40
               ret c
                dec b            ; -
               ret z

                call DEC_Y
                ld a,h
                cp #40
               ret c
                dec b            ; -
               ret z

                call DEC_Y
                ld a,h
                cp #40
               ret c
                ld a,c           ; +
                xor (hl)
                ld (hl),a
                dec b
               ret z

                call DEC_Y
                ld a,h
                cp #40
               ret c
                ld a,c           ; +
                xor (hl)
                ld (hl),a
               djnz 1B
               ret



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

Ramka1x1colmove  ; for Addresses / для Адресации
            call OffRmDirect
            call NOKEY_
            call SV_ADEF         ; стандартный курсор
            ld hl,BoxCol8x8pxLU
            ld (Ramka1.BoxAdrCall),hl
            xor a
            push af
           jr Ramka1.br_nk

;---- Выборка рамочкой
; not flag c - перемещение рамки
; set flag c - выбор размера рамки

Ramka1_     call Ramka1      ; для работы в странице GUI
           jp guiRAM

Ramka1      push af
            call OffRmDirect     ; блокировка направления
.nk         call NOKEY_
.br_nk      call SetPixCUR
            xor a
            ld (fl_kadr),a
            ld hl,(ARW_X)
            pop af
           jr nc,.move           ; для перемещения
            call .iRamka1_       ; выбор размера, ставим рамку
            ld hl,.immSize
            call ARW_SCN_
            push af
            ld hl,(MiniLoupe.oldXY)
            call .iRamka1_1
            pop af
           jr c,2F
            ld hl,(MiniLoupe.oldXY)
            ld e,(ix+0)
            ld d,(ix+1)
            call hlde_minmax_
            call bc_hldesize
           jr c,2F
            call IX_debc_
1           xor a
2          jp LD_ARW

.move       xor a
            ld (RmNewDr),a
            ex de,hl
            call .iRamka1m_
            ld hl,.immMove
            call ARW_SCN_
            push af
            ld de,(MiniLoupe.oldXY)
            xor a
            call .iRamka1m_1
            pop af
           jr c,2B
            call RmExDr
            ld hl,(MiniLoupe.oldXY)
           jr nz,.move
            ld (ix+0),l
            ld (ix+1),h
           jr 1B


.immSize           ; прерывание для размера x1
                call MiniLoupe4000    ; MiniLoupeHK
                ld hl,(ARW_X)
                push hl
                ld de,(MiniLoupe.oldXY)
                xor a
                sbc hl,de
                pop hl
               jr z,fl_kadr.inc
                call vary_kadr
               ret nz
                push hl
                ex de,hl
                call .iRamka1_1    ; снимаем рамку
                pop hl
.iRamka1_       ld (MiniLoupe.oldXY),hl   ; ставим новую рамку
                call MiniLoupe.Norm4000_
.iRamka1_1      ld e,(ix+0)
                ld d,(ix+1)
               jp BoxPix12



.immMove          ; прерывание для перемещения x1
                xor a
                ld (flg_WinP),a
                call RmHkeys
                ld hl,(ARW_X)
                ld de,(MiniLoupe.oldXY)
                ld a,(MiniLoupeHK.jr)
                or a
               jr nz,1F
                push hl
                sbc hl,de
                pop hl
               jr nz,2F
1               xor a
                call fl_kadr.inc    ; jr z,vary_kadr_
                call Ramka_WinCount  ; по необходимости сбрасывает возврат
2               call vary_kadr
               ret nz
                push hl
                xor a               ; флаг стирания рамки
                call .iRamka1m_1    ; снимаем рамку
                pop de
.iRamka1m_      ld (MiniLoupe.oldXY),de    ; ставим новую рамку
                call MiniLoupe.Norm4000_de
                ld a,255            ; флаг установки рамки
.iRamka1m_1     ld c,(ix+2)
                ld b,(ix+3)
.BoxCall
                 call Ret          ; Ramka1.Box2CallADR
.Box2CallADR EQU $-2
.BoxJPramka     jp BoxPixLU    ; тут процедура в зависимости от направления
.BoxAdrCall EQU $-2




vary_kadr          ; проверка вывода (выводим через прерывание, чтоб мерцало поменьше)
fl_kadr EQU $+1 : ld a,0
.inc              inc a
                  and 1
                  ld (fl_kadr),a
                 ret       ; out nz - 0, z - 1
;vary_kadr_

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





Ramka_WinCount  ld a,(MiniLoupeHK.jr)     ; по необходимости сбрасывает возврат
                or a
               jr nz,1F
.x8             call .aga
               ret z
                pop af     ; убираем возврат
               ret
.aga            ld a,(WinMenu.rsn_flg)
                or a
               ret nz
                call INTCOUNT
               ret nz
1
Ramka_flWin_ EQU $+1 : ld a,0
                or a
               jr z,2F
                ld (flg_WinP),a
                xor a   ; set fl z
               ret
2               inc a   ; set fl nz
               ret

; not flag c - перемещение рамки
; set flag c - выбор размера рамки

Ramka8_     call Ramka8   ; для работы в странице GUI
           jp guiRAM

Ramka8      push af
            call OffRmDirect
.nk         call NOKEY_
            call SV_ADEF         ; стандартный курсор
            call .xy_xcyc
            pop af
           jr nc,.move           ; для перемещения
            call .iRamka1_       ; выбор размера, ставим рамку
            ld hl,.immSize
            call ARW_SCN_
            push af
            ld hl,(.oldARW_)
            call .iRamka1_1
            pop af
           jr c,2F
            ld hl,(.oldARW_)
            ld e,(ix+0)
            ld d,(ix+1)
            call hlde_minmax_
            call bc_hldesize
           jr c,2F
            inc c
            inc b
            call IX_debc_
1           xor a
2          jp LD_ADEF           ; восстановление курсора

.move       xor a
            ld (RmNewDr),a
            ex de,hl
            call .iRamka1m_
            ld hl,.immMove
            call ARW_SCN_
            push af
            ld de,(.oldARW_)
            xor a
            call .iRamka1m_1
            pop af
           jr c,2B
            call RmExDr
            ld hl,(.oldARW_)
           jr nz,.move
            ld (ix+0),l
            ld (ix+1),h
           jr 1B

.immSize           ; прерывание для размера x8
                call .xy_xcyc
                push hl
                ld de,#0000
.oldARW_   EQU $-2
                xor a
                sbc hl,de
                pop hl
               ret z
                push hl
                ex de,hl
                call .iRamka1_1    ; снимаем рамку
                pop hl
.iRamka1_       ld (.oldARW_),hl   ; ставим новую рамку
.iRamka1_1      ld e,(ix+0)
                ld d,(ix+1)
               jp BoxCol12

.immMove          ; прерывание для перемещения x8
                xor a
                ld (flg_WinP),a
                call RmHkeys_
                call .xy_xcyc
                ex de,hl
.immDEoPxy EQU $+1:  ld bc,#0000
                ld (.immDEoPxy),hl
                xor a
                sbc hl,bc
                 ex af,af'          ; сохраняем флаг z
                ld bc,(.im8_hl)
                ld hl,(.imv_hl)
                xor a
                sbc hl,bc
                ex de,hl
                ld de,(.oldARW_)
               jr nz,1F
                push hl
                sbc hl,de
                pop hl
               jr nz,1F
                 ex af,af'           ; восстанавливаем флаг z
               ret nz
                call Ramka_WinCount.x8    ; по необходимости сбрасывает возврат
1               push hl
                xor a
                call .iRamka1m_1    ; снимаем рамку

.im8_hl EQU $+1 : ld hl,#0000       ; смещение для рамки при разных направлениях
                ld (.imv_hl),hl
                pop de
.iRamka1m_      ld (.oldARW_),de    ; ставим новую рамку
                ld a,255
.iRamka1m_1     ld c,(ix+2)
                ld b,(ix+3)
                ex af,af'
                call debc_x8_
                ex af,af'
.imv_hl EQU $+1 : ld hl,#0000
                add hl,de
                ex de,hl
               jp Ramka1.BoxCall     ; там процедура в зависимости от направления


.xy_xcyc     ld hl,(ARW_X)
             ld e,l
             ld d,h
.xy_xcyc1_   srl h : srl l
             srl h : srl l
             srl h : srl l
             ld (ARW_XC),hl
            ret

ARWXtoARWXC     ld hl,(ARW_X)         ; преобразование из пиксельных в знакоместовые координаты
               jr Ramka8.xy_xcyc1_
ARRPtoARWXC    EQU Ramka8.xy_xcyc1_   ; то же но из hl


RmHkeys          call RmHkeys_
                jp MiniLoupe4000
RmHkeys_         call REDEF_gui      ; напрямую т.к. в сегменте GUI
                 ld a,(LAST_KEY)
                 res 5,a
                 cp "V"
                jp nz,Ret
RmDopVar_ EQU $-2                    ; дополнительные проверки клавиш для окошек
flRmDir_         nop                 ; nop / ret - флаг использования направления
                 ld a,1
                 ld (Arw_Lp.flM_),a
                 ld (RmNewDr),a
                 ld a,(RmDirect)
                 inc a
                 and 3
                 ld (RmDirect),a
                 pop af             ; убираем возврат
                jp LdLastKey        ; убираем клавишу


OnRmDirect    xor a        ; 'nop'  ; включение направления
             jr 1F
OffRmDirect   call ResRmDirect
              ld a,#C9     ; 'ret'  ; выключение направления
1             ld (flRmDir_),a
              xor a
             ret
ResRmDirect   xor a          ; обнуление направления
              ld (RmDirect),a
             jr SetNewDirect

RmExDr          ld a,0
RmNewDr  EQU $-1
                or a
               ret z
SetNewDirect    ld bc,#0000
RmDirect EQU $-2
                ld a,b
                ld (RmNewDr),a
                ld hl,Rm_tbl
                add hl,bc
                add hl,bc
                ld a,(hl)
                inc hl
                ld h,(hl)
                ld l,a
                ld (Ramka1.BoxAdrCall),hl
                ld a,c
                ld h,b
                ld l,b  ; hl=0
                or a
               jr z,1F
                ld l,7
                dec a
               jr z,1F
                ld h,l
                dec a
               jr z,1F
                ld l,b
1               ld (Ramka8.im8_hl),hl
                xor a
                inc a     ; a=1 set nz
               ret

flg_WinP    DB 0   ; флаг вызова превью из модуля окон

Rm_tbl     DW BoxPixLU
           DW BoxPixRU
           DW BoxPixRD
           DW BoxPixLD

