; Mini Loupe for BGE / Минилупа для BGE  MiniLoupe.l0

;MiniLoupeSPG     ld a,#FC   ; #CB,#FC - set 7,h
              ;  jr 1F
MiniLoupeS5      ld a,#BC   ; #CB,#BC - res 7,h
1                ld (MiniLoupe.set7h_+1),a
                ret
MiniLoupeHK  jr  .js
.jr      EQU  $-1     ;  расстояние до MiniLoupe или 0
.js
              call LdLastKey
              res 5,a
              cp "M"
             ret nz
MiniLoupe     xor a
              ld (MiniLoupeHK.jr),a
              inc a
              ld (INTCOUNT.intcount),a
              ld (fl_kadr),a
             push ix
              call guiRAM
              ld hl,TextAdr
              ld de,.MladrBF
              ld bc,EspFLen
              push hl,de,bc
              ldir
              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

              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 bc,hl,de
              ldir
             pop ix
              ld a,(.fire)
              or a
             ret z
              ld (Arw_Lp.flM_),a
              cp a   ; set fz
            ret
.start
            ld hl,(ARW_XC)
           push hl
            ld a,l
            cp 16
            ld a,0
           jr nc,1F
            ld a,32-11
1           ld (.WMLoupe),a
            ld a,h
            cp 12
            ld a,0
           jr nc,1F
            ld a,24-13
1           ld (.WMLoupe+1),a

           ld hl,(ARW_X)
           ld (.XY),hl
           ld a,l
           and 7
           inc a
           ld b,a
           ld a,1
1          rrca
          djnz 1B
           ld (.Imm_msk),a
          push hl
           ld d,h
           ld e,l
           call PixHL
           ld (.Imm_sadr),hl
          pop hl
          push hl
           ld a,e
           sub 4
          jr nc,1F
           xor a
1          ld e,a
           ld a,d
           sub 4
          jr nc,1F
           xor a
1          ld d,a
           ld a,247
           cp e
          jr nc,1F
           ld e,a
1          ld a,183
           cp d
          jr nc,1F
           ld d,a
1          ld (.pwXY),de   ; позиция окна в пикселях
           ld a,e
           and 7
           ld (.dspX0),a     ; cмещение до 0-го пикселя в знакоместе окна
          push de
           ld a,l
           sub e
           ld (.XYcurP),a      ; X поз. курсора в окне
           ld a,h
           sub d
           ld (.XYcurP+1),a    ; Y поз. курсора в окне

           ld a,l
           and #F8
           sub e
          jr z,1F
          jr nc,2F
1          add a,8
2          ld (.colWX),a   ; X - позиция границы окон
           ld a,h
           and #F8
           sub d
          jr z,1F
          jr nc,2F
1          add a,8
2          ld (.colWY),a  ; Y - позиция границы окон

          pop de       ; поз. окна
          call PixHL   ; HL -addr in screen
          push hl
          ld de,.MLpBfX
          call .ldBf_
          pop hl
          push hl
          ld a,h
          rra
          rra
          rra
          and #03
          or #58
          ld h,a
          ld de,.MLpBcol  ; цвет
          ld a,(hl)
          ld (de),a
          inc l
          inc de
          ld a,(hl)
          ld (de),a
          inc de
          ld bc,31
          add hl,bc
          ld a,(hl)
          ld (de),a
          inc l
          inc de
          ld a,(hl)
          ld (de),a
          pop hl
          ld a,ScrPage|#10
.basePg_ EQU $-1
          call Ram
.set7h_   set 7,h    ; addr with #C000      ; #CB#FC -set 7,h or #CB#BC -res 7,h
          ld de,.MLpBf
          call .ldBf_

           ld hl,.MLpBf   ; нормирование буфера
           ld c,18
1          ld b,0
.dspX0   EQU $-1
           inc b
           dec b
          jr z,3F
2          inc hl
           rl (hl)
           dec hl
           rl (hl)
          djnz 2B
           inc hl
           inc hl
           dec c
          jr nz,1B
3
           call guiRAM
          pop hl    ; hl - XY
           ld a,l  ; x
           ld de,.TpX
           push hl
           call PDEC    ; напрямую из gui
           pop hl
           inc de   ; .TpY
           ld a,h
           call PDEC
          pop hl    ; hl - Xc Yc
          push hl
           ld h,0
           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

            ld hl,(.WMLoupe)
            ld bc,#0505
            add hl,bc
            add hl,hl
            add hl,hl
            add hl,hl
            ld (ARW_X),hl

.l0         ld ix,.WMLoupe
            xor a        ; nop
            ld (.CrWmlrt),a
            ld (.fire),a

            ld a,%1010+64
.l1         ld (ix+6),a
            ld a,Win
            call GUI_
            push af
            call .ResImm
            call NOKEY_gui  ; напрямую
            call CLOSE
            pop af
            cp 127
           jr nc,.Exit
            or a
           jr nz,1F
            ld a,1
            ld (.fire),a
           jr .Exit
1           dec a           ; ищем новую позицию курсора
            ld b,#FF
2           inc b
            sub 9
           jr nc,2B
            add a,9
            ld c,a
            ld hl,0
.pwXY     EQU $-2
            add hl,bc
            ld a,MiniLoupe-MiniLoupeHK.js    ;disp for jr
            ld (MiniLoupeHK.jr),a
           jr 1F
.Exit
           ld hl,#0000
.XY     EQU $-2            ; позиция курсора
1          ld (ARW_X),hl
           srl h
           srl l
           srl h
           srl l
           srl h
           srl l
           ld (ARW_XC),hl
           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

.ldBf_    ld b,9
1         ld a,(hl)
          ld (de),a
          inc l
          inc de
          ld a,(hl)
          ld (de),a
          dec l
          inc de
          call INC_Y
         djnz 1B
         ret

.WMLoupe   DB 0,0,11,13,5*8,5,%1010+64
; 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
           DB 0          ; запасной байт-флаг (reserved for flags)
           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,10,"p:"
.TpX      DB "000,"
.TpY      DB "000",13,"c:"
.TcX      DB "00,"
.TcY      DB "00",#17,5," Fire!"
          DB 0


.Sml      DB 6,11,4,1,%11
          DB 1,1,128+9,9,%10  ; таблица 9x9
           DB 1,1,1,1,81

          DB #FF

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

     ; установка цвета области в окне ; [IX] - параметры текущего окна
; in  a= color, e = y , d = x , b = sx , c = sy



.CrWml     ld de,#060B
           ld bc,#0401
           ld a,6*8
           call SetAtrW   ; выделение цветом (желтым фоном)

.CrWmlrt   nop            ; nop / ret
           ld a,#C9       ; ret
           ld (.CrWmlrt),a
          push ix

           ld hl,(.WMLoupe)
           inc h
           inc l
           push hl
           call ADRHL8      ; HL - адрес вывода

           ld ix,.MLpBf
           ld b,9

.ll0       push hl,bc
           ld b,9
1          ld de,.Mspr0
           bit 7,(ix+0)
          jr z,2F
           ld de,.Mspr1
2          call .prnt
           ld a,(ix+0)
           xor (ix+18)
           rla
          jr nc,3F
           ld de,.Mxor
           call .prntX
3          rl (ix+19)
           rl (ix+18)
           rl (ix+1)
           rl (ix+0)
           inc l
          djnz 1B
           pop bc
           pop hl
           call INC_YY
           inc ix
           inc ix
          djnz .ll0
           pop hl      ; поз. начала вывода
           push hl
           ld a,0
.colWY   EQU $-1       ; линия границы знакоместа по Y
           add a,h
           ld h,a
           call ADRHL8
           ld b,9
1          ld (hl),%10101010
           inc l
          djnz 1B
           pop hl
           push hl
           ld a,0
.colWX   EQU $-1       ; линия границы знакоместа по X
           add a,l
           ld l,a
           call ADRHL8
           ld b,9*4
1          ld a,(hl)
           or 128
           ld (hl),a
           inc h
           ld a,(hl)
           and #7F
           ld (hl),a
           call INC_Y
          djnz 1B
           pop hl
           push hl
           ld bc,0
.XYcurP  EQU $-2
           add hl,bc
           call ADRHL8
           ld de,.Mcur
           call .prntX
           pop hl

           pop ix

           call ADRHL8A   ; вывод цвета
           ld de,.MLpBcol

           ld a,(.colWY)
           ld b,a
           ld a,9
           sub b
           push af
           call .setColS
           pop bc
.setColS
           ld a,(de)
           ld (.setCol0),a
           inc de
           ld a,(de)
           ld (.setCol1),a
           inc de
1          push bc
           ld a,(.colWX)
           ld b,a
           ld a,9
           sub b
           ld c,a
2          ld (hl),0
.setCol0  EQU $-1
           inc l
          djnz 2B
3          ld (hl),0
.setCol1  EQU $-1
           inc l
           dec c
          jr nz,3B
           ld bc,32-9
           add hl,bc
           pop bc
          djnz 1B
         ret

.prntX     ld a,#AE   ; xor (hl)
          jr 1F
.prnt      xor a
1          ld (.mdprn),a
.prnt_     push hl,bc
           ld b,8
1          ld a,(de)
.mdprn     nop      ; меняем
           ld (hl),a
           inc h
           inc de
          djnz 1B
           pop bc,hl
          ret

.Imm      ; на прерывании подсвечиваем точкой положение курсора
          ld a,0
.Imm_calc EQU $-1
          or a
         jr z,2F
          dec a
1         ld (.Imm_calc),a
         ret
2         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   ; счётчик
         jr 1B
.ResImm   ld a,(.Immflg)
          or a
         jr nz,2B
         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,#54,#28,#54,#28,#54,#00,#00 ; XOR-ка для обозначения рисуемого пикселя
.Mcur       DB #00,#10,#10,#6C,#10,#10,#00,#00 ; XOR-ка курсора - CURSOR


.MladrBF   DS EspFLen ; буфер данных окна

.MLpBf     DS 18 ; буфер основного изображения
.MLpBfX    DS 18 ; буфер xor-ного изображения
.MLpBcol   DS 4  ; буфер цвета

LMiniLoupe    EQU $-MiniLoupe

       DISPLAY "MiniLoupe len   :",/a,LMiniLoupe
