; 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+58  ; предыдущее значение
              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 a,l              ; MiniLoupe.a_winx
                and #1F
                cp 16
                ld a,32-14
               ret c
                xor a
               ret


.start        ld a,(MiniLoupePG)
              call Ram_

.arw_adr EQU $+1 :  ld hl,(ARW_X)   ; (ARW_X) or (.oldXY)

              ld (.XY),hl
              ld a,h
              ex af,af'
              ld a,l       ; x
              ld de,.TpX
              push hl
              call PDEC    ; напрямую из 'ResGUI'
              inc de       ; .TpY
              ex af,af'
              call PDEC
              pop hl        ;
              push hl

              call ARRPtoARWXC   ; ld hl,(ARW_XC)
              ld a,h
              ld (.bxPosY_),a
              ld a,l
              ld (.bxPosX_),a
        ;      ld a,l
        ;      cp 16
        ;      ld a,0
        ;     jr nc,1F
        ;      ld a,32-14
              call .a_winx
              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
              ex (sp),hl ; pop hl
              xor a
              ld (.fire),a
              ld (.CrWml),a    ; [ nop ]

              call .normBXY  ; определяем позицию курсора -> hl

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

              pop hl

              call .Fill_ML_BUFF

              call ADRpixTOcol     ; адрес атр.
              ld bc,#10000-33
              add hl,bc
              ld bc,#031E   ; b=3, c=30
1             ld a,(hl)
              ld (de),a
              inc de
              inc hl
              ld a,(hl)
              ld (de),a
              inc de
              inc hl
              ld a,(hl)
              ld (de),a
              inc de
              ld a,b
              ld b,0
              add hl,bc
              ld b,a
             djnz 1B       ; сохранили атрибуты

.l0           ld a,128+64+%1010
.l1           ld ix,.WMLoupe
              ld (ix+6),a
              call Win_
              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 hl,#0000
.pcur_XY     EQU $-2

              ld b,#FF
1             inc b
              sub 12
             jr nc,1B
              add a,12
              sub l
              ld c,a
              ld a,b
              sub h
              ld hl,(.XY)
              add a,h
              cp 192
             jr nc,.narr
              ld b,a
              ld a,l
              add a,c
              bit 7,c
             jr z,1F
              ccf
1            jr c,.narr
              ld l,a
              ld h,b

.narr         push hl
              ld de,(.XY)
              or a
              sbc hl,de
              pop hl
              ld a,128+64+%1000
            jr z,.l1
              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             push hl
              call CLOSE
              call .ResImm
              call NOKEY_gui  ; напрямую
              pop hl

              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 a,(hl)
              inc l
              ld c,(hl)
              inc l
              ld b,(hl)
              dec l
              dec l
              rra
              rr c
              rr b
              rra
              rr c
              rr b
              ld a,c
              ld (de),a
              inc de
              ld a,b
              ld (de),a
              inc de
              pop bc
             ret
.normX2idd    call .normX2
              inc de
              inc de
             ret

.Norm4000_de  push hl,de
              ex de,hl
             jr 1F
.Norm4000_    push hl,de
1             call .normBXY
              call PixHL
              ld de,.normX2idd
              ld (.NORMADR),de
              call .Fill_ML_BUFF
              pop de,hl
             ret

.Fill_ML_BUFF  ld a,h
               and #F8
               ld h,a
               push hl
               call DEC_Y
               call DEC_Y
               ld de,ML_BUFF   ; буфер минилинзы
               ld b,12
1              dec l
               call .normX2idd
.NORMADR  EQU $-2
               inc l
               call DOWN_HL
              djnz 1B
               pop hl
              ret

.normBXY             ; определяем позицию курсора и пр. в экране ; *********
              ex de,hl
              push bc
              ld bc,#0702
              ld a,e
              and b
              add a,c
              ld l,a
              ld a,d
              and b
              add a,c
              ld h,a
              ld (.pcur_XY),hl    ; позиция курсора в лупе

              ld bc,(.WMLoupe)
              inc b
              inc c
              add hl,bc
              ld (.crcurXY_),hl
              pop bc
             ret


.WMLoupe   DB 0,8,14,16,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 2          ; пропуск: прерывани после прорисовки стрелки,спрайты
       ;    DW .CBox      ; объект область заполненная цветом (color box)
           DW #FFFF

.Tml        DB 22,1,13,#17,2," p:"
.TpX        DB "000,"
.TpY        DB "000",13,"<<!",#17,3,"c:"
.TcX        DB "00,"
.TcY        DB "00"
            DB #17,9,"Ok!>"
           DB 0

.Sml         DB 1,14,2,1,%11       ; 0  - exit or select for win loupe
             DB 9,14,4,1,%11       ; 1 - Ok! (fire)
             DB 1,1,128+12,12,%10  ; таблица 12x12
             DB 1,1,1,1,144
            DB #FF

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


;.CBox       DB 3,13,7,1,5*8+1,%1       ; подсвечиваем позиции
;            DB 4,14,5,1,5*8+1,%1
;           DB #FF

.CrWml      ret           ; [ ret ] / [ nop ]
            ld hl,(.WMLoupe)   ; (xc,yc) - окна
            inc h
            inc l
            call ADRHL8
            push hl ;  ld (.outboxAdr_),hl

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

            ld de,ML_BUFF+4*12   ; адрес атрибутов
            ld c,2
.bxPosY_ EQU $+1 : ld a,0
            or a
           jr z,1F
            call .outLN_
           jr 2F
1           call .propuskL2
2           inc de
            inc de
            inc de
            ld c,8
            call .outLN_
            inc de
            inc de
            inc de
            ld c,2
            ld a,(.bxPosY_)
            cp 23
           jr nz,3F
            call .propuskL2
           jr 4F
3           call .outLN_

4          ; вывод курсора
           call .curOUT_

;.outboxAdr_ EQU $+1 : ld hl,#0000      ; выводим точки знакоместа
           pop hl
.outBordBX push hl
           inc l
           inc l
           ld de,8
           ld b,12*4
1          set 7,(hl)
           add hl,de
           set 7,(hl)
           call INC_Y
           res 7,(hl)
           ld a,l
           sub e
           ld l,a
           res 7,(hl)
           call INC_Y
          djnz 1B
           pop hl
           call INC_YY
           call INC_YY
           call .tochkline_
           ld b,8
1          call INC_YY
          djnz 1B
.tochkline_ ld b,12
            push hl
1           ld (hl),%10101010
            inc l
           djnz 1B
            pop hl
            ld a,#C9   ; [ ret ]
            ld (.CrWml),a
           ret

.curOUT_
.crcurXY_  EQU $+1 : ld hl,#0505
           call ADRHL8
           ld de,.Mcur
.crXOR     ld b,8
1          ld a,(de)
           xor (hl)
           inc de
           ld (hl),a
           inc h
          djnz 1B
          ret

.outLN_
1           push hl,bc
             ld a,(.bxPosX_)   ; in: hl -adr for out , de - scr-adr ...
             or a
            jr nz,4F
             call .propV2
            jr 5F
4            ld b,2
             call .st111
5            inc de
             ld b,8
             call .st111
             inc de
.bxPosX_  EQU $+1 : ld a,0
             cp 31
            jr nz,6F
             call .propV2
            jr 7F
6            ld b,2
             call .st111
7            dec de
             dec de
            pop bc,hl
             call INC_YY

            exx
            inc hl
            inc hl
            inc hl
            inc hl
            exx
            dec c
           jr nz,1B
           ret

.st111
1             push de
              ld a,(de)
              ex af,af'
              xor a
              ld d,a
              call .rlbfhl_
              add a,a
              add a,a
              add a,a
              ld e,a
              push hl
              ld hl,.Mspr0
              add hl,de
              ex de,hl
              pop hl
              ex af,af'
              call .setout
              inc l
              pop de
             djnz 1B
             ret


.propuskL2   exx             ; вывод 2-х линий пустоты / hl меняется
             ld bc,8
             add hl,bc
             exx

.cr_z2Hor_    ld a,2
1             push af
              ld b,12
              push hl
              call .cr_zXHor_
              pop hl
              call INC_YY
              pop af
              dec a
             jr nz,1B
             ret

.rlbfhl_      exx
              inc hl  ; [(ML_BUFF)]
              inc hl
              inc hl
              rl (hl)
              dec hl
              rl (hl)
              dec hl
              rra
              rl (hl)
              dec hl
              rl (hl)
              rla
              ld (NtrMloupe_.stmodCT_),a ; тип прозрачности
              rla
              exx
             ret

.propV2
              ld b,2
1             call .rlbfhl_
             djnz 1B
.cr_zHor2_    ld b,2
.cr_zXHor_    push de
              ld de,.MsprNon
              ld a,03  ; цвет для запредельных
1             call .setout
              inc l
             djnz 1B
              pop de
             ret

.setout       push hl,de,bc
              push af
              ld b,8
1             ld a,(de)
              inc de
              ld (hl),a
              inc h
             djnz 1B
              dec h
              call ADRpixTOcol
              pop af
              call NtrMloupe_
              pop bc,de,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





;------------------------------------------------------------------------------------------
.MsprNon    DB 128,0,2,0,8,0,32,0               ; за пределами экрана/окна
                                                ; блоки линзы 8 с сеткой :
.Mspr0      DB #80,#00,#00,#00,#00,#00,#00,#00  ; / пусто
.Mspr0m     DB 128,85,0,85,0,85,0,85            ; / пусто + маска
.Mspr1m     DB 128,85,42,85,42,85,42,85         ; / бит + маска
.Mspr1      DB #FE,#FE,#FE,#FE,#FE,#FE,#FE,#01  ; / бит


;.Mxor       DB #00,#54,#28,#54,#28,#54,#00,#00  ; XOR-ка для обозначения рисуемого пикселя

.Mcur       DB #00,#10,#10,#6C,#10,#10,#00,#00  ; XOR-ка курсора - CURSOR


LMiniLoupe    EQU $-MiniLoupe

       DISPLAY "MiniLoupe len   :",/a,LMiniLoupe
