; Mini Loupe for BGE / Минилупа для BGE  MiniLoupe.l0
MiniLoupe4000     ; для окон
              ld de,MiniLoupe.oldXY
              ld hl,MiniLoupe.normAT4000
             jr 2F
MiniLoupe4000_ ld hl,MiniLoupe.norm4000_
             jr 1F
MiniLoupeScr  ld hl,MiniLoupe.normATscr
1             ld de,ARW_X
2             ld (MiniLoupe.NORMADR),hl
              ld (MiniLoupe.arw_adr),de
              xor a      ; ld a,ScrPage
              ld (MiniLoupePG),a
MiniLoupeHK  jr  .js
.jr      EQU  $-1     ;  расстояние до MiniLoupe или 0  (оно же флаг использования)
.js
              call LdLastKey
              res 5,a
              cp "M"
             ret nz
MiniLoupe

.oldXY   EQU ML_BUFF+56   ; предыдущее значение
              xor a
              ld (MiniLoupeHK.jr),a
              inc a
              ld (INTCOUNT.intcount),a
              ld (fl_kadr),a
             push ix
              call guiRAM
              ld hl,TextAdr   ; from 'WinGUI.asm'
              ld b,EspF__
1             ld e,(hl)       ; сохранение TextAdr
              inc hl
              ld d,(hl)
              inc hl
              push de
             djnz 1B
              push hl

              ld hl,(Ixx)
              push hl
              ld hl,(Ixx+2)
              push hl
              ld hl,(Ix)
              push hl
              ld hl,(ARW_ADR)
              push hl
              ld hl,(ARW_XDISP)
              push hl
              call ARW_DEFAULT_gui
              ld hl,(Arw_Lp+1)
              push hl
              ld hl,Ret
              ld (Arw_Lp+1),hl

              call .start

              call guiRAM
              pop hl
              ld (Arw_Lp+1),hl
              pop hl
              ld (ARW_XDISP),hl
              pop hl
              ld (ARW_ADR),hl
              pop hl
              ld (Ix),hl
              pop hl
              ld (Ixx+2),hl
              pop hl
              ld (Ixx),hl

              pop hl
              ld b,EspF__
1             pop de         ; восстановление TextAdr
              dec hl
              ld (hl),d
              dec hl
              ld (hl),e
             djnz 1B
             pop ix
              ld a,(.fire)
              or a
             ret z
              ld (Arw_Lp.flM_),a
              cp a   ; set fz
             ret

;------------------------------------------------------------------
.a_winx         ld b,32-14           ; MiniLoupe.a_winx - для окна
.a_winx_        ld a,l
                and #1F
                cp 16
                ld a,b
               ret c
                xor a
               ret

.start        ld a,(MiniLoupePG)
              call Ram_

.arw_adr EQU $+1 :  ld hl,(ARW_X)   ; (ARW_X) or (.oldXY)
              ld (ARW_X),hl
              ld (.XY),hl
              ld a,l       ; x
              ld de,.TpX
              push hl
              call PDEC    ; напрямую из gui
              pop hl
              inc de       ; .TpY
              ld a,h
              push hl
              call PDEC
              pop hl        ;
              push hl

              call ARWXtoARWXC   ; ld hl,(ARW_XC)
         ;     ld a,l
         ;     cp 16
         ;     ld a,0
         ;    jr nc,1F
         ;     ld a,32-13
              ld b,32-13
              call .a_winx_
1             ld (.WMLoupe),a
              push hl
              ld h,0         ; hl - Xc Yc
              ld b,h
              ld de,.TcX
              call  PDEC_W.N2
              pop hl
              ld l,h
              ld h,b
              inc de   ; .TcY
              call  PDEC_W.N2

              pop hl

              push hl
              ex de,hl
              call PixHLaM
              ld (.Imm_msk),a
              ld (.Imm_sadr),hl
              pop hl
              xor a
              ld (.fire),a

              call .normBXY  ; определяем стартовую позицию окна минилупы

              ld bc,(.WMLoupe)
              inc b
              inc c
              add hl,bc
              add hl,hl
              add hl,hl
              add hl,hl
              inc h         ; чтобы не в самом углу клетки
              inc l
              inc h
              inc l
              ld (ARW_X),hl

              call PixHL      ; in E-x, D-y ; out HL-adr
              ld de,ML_BUFF   ; буфер минилинзы
;.frmAdr  EQU $-2
              push hl
              ld b,11
1             call .normATscr     ;  MiniLoupe.NORMADR
.NORMADR  EQU $-2
              call DOWN_HL
             djnz 1B
              pop hl
              call ADRpixTOcol     ; адрес атр.
              ld bc,#031E   ; b=3, c=30
1             ld a,(hl)
              ld (de),a
              inc de
              inc l
              ld a,(hl)
              ld (de),a
              inc de
              inc l
              ld a,(hl)
              ld (de),a
              inc de
              ld a,b
              ld b,0
              add hl,bc
              ld b,a
             djnz 1B       ; сохранили атрибуты

              ld a,128+64+%1010
.l1           ld ix,.WMLoupe
              ld (ix+6),a
              call Win_
              push af
              call .ResImm
              call CLOSE
              call NOKEY_gui  ; напрямую
              pop af
              ld hl,(ARW_X)
              inc a
             jr nz,1F
              ld a,(BRK)   ; 255
              rra
              and 1
             jr z,.narr
1             dec a
             jr z,.Exit    ; 0
              dec a
             jr z,.setFire ; 1
              dec a        ; tab
              ld b,#FF
1             inc b
              sub 11
             jr nc,1B
              add a,11
              ld c,a        ; c - x  b - y
              ld hl,#0000
.pwXY       EQU $-2
              add hl,bc
.narr         ld a,MiniLoupe-MiniLoupeHK.js    ;disp for jr
              ld (MiniLoupeHK.jr),a
            jr 1F

.setFire      inc a
.Exit         ld (.fire),a
              ld hl,#0000
.XY     EQU $-2            ; позиция курсора
1             ld (ARW_X),hl
              call ARRPtoARWXC  ; MiniLoupe.fire
              ld a,0
.fire    EQU $-1
              ld (BRK),a
              add a,a
              add a,a
              add a,a
              add a,a
              ld (DIRECT),a
             ret


.normAT4000   inc de
              inc de
             jr .normX2
.normATscr    set 7,h            ; сохраняем пиксели из #C000
.norm4000_    call .normX2
              res 7,h            ; сохраняем пиксели из #4000
.normX2       push bc      ; сохраняем в буфер
              ld c,(hl)
              inc hl
              ld b,(hl)
              inc hl
              ld a,(hl)
              dec hl
              dec hl
              ex af,af'
              ld a,0
.strtXpos  EQU $-1         ; позиция x начального пикселя
              or a
             jr z,2F
1             ex af,af'
              rla
              rl b
              rl c
              ex af,af'
              dec a
             jr nz,1B
2             ld a,b
              ld (de),a
              inc de
              ld a,c
              ld (de),a
              inc de
              pop bc
             ret

.Norm4000_de  push hl,de
              ex de,hl
             jr 1F
.Norm4000_    push hl,de
1             call .normBXY
              call PixHL
              ld de,ML_BUFF
              ld b,11
1             call .normX2
              inc de
              inc de
              call DOWN_HL
             djnz 1B
              pop de,hl
             ret


.normBXY      push hl        ; определяем стартовую позицию окна минилупы
              ld a,l
              sub 5
             jr nc,1F
              xor a
1             ld l,a
              ld a,h
              sub 5
             jr nc,1F
              xor a
1             ld h,a
              add a,11
              sub 192
             jr c,1F
              ld h,192-11
1             ld a,l
              add a,11
             jr nc,1F
              ld l,256-11
1             pop de          ; de - позиция пикселя, hl - позиция начала окошка
              ld a,d
              sub h
              ld d,a
              ld a,e
              sub l
              ld e,a
              ld (.pwXY),hl
              ex de,hl
              ld (.crcurXY_),hl     ; позиция курсора в боксе
              ld a,e
              and 7
              ld (.strtXpos),a      ; позиция x начального пикселя
              ld (.strtXpos_),a
              ld a,d
              and 7
              ld (.strtYpos_),a     ; позиция y начального пикселя
             ret


.WMLoupe   DB 0,8,13,15,5*8,5,128+%1010
; 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
; Bit 5 -   0  пока не используется (not used)
; Bit 6 -   при Bit 2 = 1 не сохранять окно в свапинге при перерисовке (бит обнуляется после вызова окна),
;           при Bit 2 = 0 сохранять окно в свапинге при перерисовке ( v3.12 )
; Bit 7 -   (128+flags) Использовать адреса дополненительных функций. ( для совместимости с некоторыми старыми модулями)

           DB 5*8+3      ; атрибут неактивного цвета (non active color attribute)
           DW .Tml       ; объект-текст (text object)
           DW .Sml       ; объект-подсветка (выборка) (highlighting object)
           DW .Hml       ; горячие клавиши (hotkeys)
           DW 4          ; пропуск: кнопки , флажки , радио кнопки , ползунок
           DW .CrWml     ; вызов при создании (call on create)
           DW .Imm       ; вызов на прерывании
          DW #FFFF


.Tml        DB 22,1,12,#17,2," p:"
.TpX        DB "000,"
.TpY        DB "000",13,"<<*",#17,3,"c:"
.TcX        DB "00,"
.TcY        DB "00"
            DB #17,8,"Ok!>"
           DB 0
.Sml         DB 1,13,2,1,%11       ; 0  - exit or select for win loupe
             DB 9,13,3,1,%11       ; 1 - Ok! (fire)
             DB 1,1,128+11,11,%10  ; таблица 11x11
             DB 1,1,1,1,121
            DB #FF


.Hml       DB "M",0
            DW 0    ; M - выход
           DB 13,0
            DW 1      ; enter - fire
           DB #FF


.CrWml
            ld hl,(.WMLoupe)   ; (xc,yc) - окна
         ;   ld a,13
          ;  call .ramkaMLP
             call ADRHL8
             ld a,33
             add a,l
             ld l,a
             ex de,hl

            exx                 ; вывод области увеличения
            ld hl,ML_BUFF     ; ld hl,(.frmAdr)
            exx

            ld c,11
1           ld b,11
            push de
2           push bc
            exx
            ld d,h
            ld e,l
            rl (hl)
            inc hl
            rl (hl)
            rl b
            inc hl
            rl (hl)
            inc hl
            rl (hl)
            rl c
            ex de,hl
            ld a,b
            exx
            ld hl,.Mspr0
            rra
           jr nc,3F
            ld hl,.Mspr1
3           push de
            ld b,#08
4           ld a,(hl)
            inc hl
            ld (de),a
            inc d
           djnz 4B
            pop de
            exx
            ld a,b
            xor c
            exx
            ld c,d
            rra
           jr nc,5F
            ld hl,.Mxor
            call .crXOR
            ld d,c
5           inc e
            pop bc
           djnz 2B
            pop de
            ld a,32
            add a,e
            ld e,a
           jr nc,6F
            ld a,8
            add a,d
            ld d,a
6           exx
            ex de,hl
            inc hl
            exx
            dec c
           jr nz,1B
                               ; вывод атрибутов в области увеличения
.test       ld hl,(.WMLoupe)   ; (xc,yc) - окна
            inc h
            inc l
            push hl
            call ADRHL8A        ; адрес вывода атрибутов
            push hl
            exx
            pop de
            ld a,8
            sub 0
.strtXpos_ EQU $-1             ; позиция X начального пикселя         MiniLoupe.test
            ld (.crotAlineX_),a
            ld (.crotbrX_),a
            ld a,8
            sub 0
.strtYpos_ EQU $-1             ; позиция Y начального пикселя
            ld (.crotbrY_),a
            ld c,a
            ld b,11
1           call .croutAline
            dec c
           jr nz,2F
            inc hl
            inc hl
            inc hl
            ld c,8
2          djnz 1B
            pop hl
            push hl
            call ADRHL8      ; прорисовка границ знакомест
            push hl
            ld b,10          ; прорисовка вертикалей
            ld c,8
.crotbrX_ EQU $-1
1           inc l
            dec c
           jr nz,3F
            ld c,8
            push hl,bc
            ld b,44
2           ld a,(hl)
            or 128
            ld (hl),a
            call DOWN_HL
            ld a,(hl)
            and #7F
            ld (hl),a
            call DOWN_HL
           djnz 2B
            pop bc,hl
3          djnz 1B
            pop hl
            ld b,10           ; прорисовка горизонталей
            ld c,8
.crotbrY_ EQU $-1
1           call INC_YY
            dec c
           jr nz,3F
            ld c,8
            push bc
            ld a,l
            ld b,11
2           ld (hl),%10101010
            inc l
           djnz 2B
            ld l,a
            pop bc
3          djnz 1B
            pop hl
            ld de,#0505
.crcurXY_  EQU $-2
            add hl,de
            call ADRHL8
            ex de,hl     ; поскольку .crXOR используется и ранее
            ld hl,.Mcur
.crXOR      ld b,8
1           ld a,(de)
            xor (hl)
            inc hl
            ld (de),a
            inc d
           djnz 1B
           ret

.croutAline  push hl,bc  ; вывод строки атрибутов in de - addr
             ld a,e
             ex af,af'
             ld b,11
             ld c,8
.crotAlineX_ EQU $-1
             ld a,(hl)
             inc hl
1            ld (de),a
             inc e
             dec c
            jr nz,2F
             ld c,8
             ld a,(hl)
             inc hl
2           djnz 1B
             ex af,af'
             add a,32
             ld e,a
            jr nc,1F
             inc d
1            pop bc,hl
            ret






.Imm         ; мигание пикселя
            ld a,8
.Imm_calc  EQU $-1
            dec a
           jr nz,2F
1           ld c,128
.Imm_msk   EQU $-1
             ld hl,#4000
.Imm_sadr  EQU $-2
             ld a,(hl)
             xor c
             ld (hl),a
             ld a,0
.Immflg    EQU $-1
             cpl
             ld (.Immflg),a
             ld a,8   ; счётчик
2            ld (.Imm_calc),a
           ret
.ResImm      ld a,(.Immflg)
             or a
            jr nz,1B
            ret





;------------------------------------------------------------------------------------------
.Mspr0      DB #80,#00,#00,#00,#00,#00,#00,#00 ; блоки линзы 8 с сеткой
.Mspr1      DB #FE,#FE,#FE,#FE,#FE,#FE,#FE,#01
.Mxor     ;  DB #00,#00,#28,#00,#28,#00,#00,#00 ; XOR-ка для обозначения рисуемого пикселя
            DB #00,#54,#28,#54,#28,#54,#00,#00 ; XOR-ка для обозначения рисуемого пикселя
.Mcur       DB #00,#10,#10,#6C,#10,#10,#00,#00 ; XOR-ка курсора - CURSOR

.bSprsOut     DB 128,0,2,0,8,0,32,0              ; +0  за пределами
.bSprsMzer    DB 128,85,0,85,0,85,0,85           ; +8  маска на пустоте
.bSprsMpix    DB 128,85,42,85,42,85,42,85        ; +24 маска на пикселе


LMiniLoupe    EQU $-MiniLoupe

       DISPLAY "MiniLoupe len   :",/a,LMiniLoupe

