; part of the GUI for BGE

STOP_ARW_gui
INITMV   LD HL,STEP
         LD DE,STPCNT
         LDI
         LDI
         LDI
        RET

MOVES_gui
        CALL moves
        LD HL,(ARW_X)
        DUP 3
        SRL H
        SRL L
        EDUP
        LD (ARW_XC),HL
        RET


moves   LD A,(MDIRECT)
        AND A
        RET NZ
        LD A,(DIRECT)
        PUSH AF
        CALL MVEXAM
        POP AF
        LD C,A
        RRCA
        AND 5
        XOR C
        LD B,A
        RRCA
         jr nc,3F
          push af,bc       ; для работы с длинными координатами  X   /DA
          ld a,c
          rrca
          ld a,(SPDCNT)
          ld c,a
          ld b,0
          ld hl,(DarwX)
         jr c,1F
          sbc hl,bc
         jr nc,2F
          ld h,b
          ld l,b   ; hl=0
         jr 2F
1         add hl,bc
          call MCOORD.check
2         ld (DarwX),hl
          pop bc,af
3       LD HL,ARWXMN
        LD DE,ARW_X
        PUSH BC
        CALL C,XYMOVE
        POP BC
        RRC C
        RRC C
        LD A,B
        RRCA
        RRCA
        RRCA
        INC DE
        LD HL,ARWYMN
        JR C,XYMOVE
        RET


MVEXAM  LD BC,(DIROLD)
        LD (DIROLD),A
        AND #0F
        JR Z,INITMV
        LD HL,STPCNT
        DEC (HL)
        RET NZ
        LD A,(STEP)
        LD (HL),A
        INC HL
        LD A,(HL)
        DEC A
        RET Z
        LD (HL),A
        INC HL
        INC (HL)
        RET

XYMOVE  LD A,C
        RRCA
        LD A,(SPDCNT)
        LD C,A
        LD A,(DE)
        JR C,XYINC
        SUB C
        JR C,XYMNX
        LD (DE),A
        CP (HL)
        JR C,XYMNX
        RET

XYINC   ADD A,C
        INC HL
        JR C,XYMNX
        LD (DE),A
        CP (HL)
        RET C
XYMNX   LD A,(HL)
        LD (DE),A
        RET

ARW_OLD_gui
        LD HL,PutArw
        LD DE,GetArw
; HL - PUTARW
; DE - GETARW
ARW_NEW_gui
        LD (PUTARW_gui+1),HL
        LD (GARW+1),DE
        RET

PUT_INT_gui
        LD (putarw+1),HL
        RET

GET_INT_gui
        LD (getarw+1),HL
        RET

PUTARW_gui
        CALL PutArw
putarw  JP Ret_gui

GETARW_gui
getarw  CALL Ret_gui
GARW    CALL GetArw
        RET

PutArw   LD DE,(ARW_X)

        ld hl,(ARW_XDISP)
        ld a,d              ; смещение спрайта вверх относительно координат стрелки /DA
        sub h

       jr nc,1F

         xor a

1        ld d,a
         ld a,e             ; смещение спрайта влево относительно координат стрелки /DA
         sub l
        jr c,1F
         ld e,a
         and 7
1
         sub 8
         neg
         ld (ZERO_2.Xrot),a    ; ld (LP1.Xrot),a

ZERO_2  LD A,D
        RRA
        SCF
        RRA
        RRA
        AND #5F
        LD H,A
        XOR E
        AND 7
        XOR E
        RRCA
        RRCA
        RRCA
        LD L,A
         push hl,de
         ld a,h
         and #F8
         ld h,a
         ld (XPLACE),hl
         ld de,PLACE
         push hl
         ld bc,#03FF
1        ld a,b
         ld b,8
2        ldi : ldi
         dec hl : dec hl
         inc h
        djnz 2B
         ld b,a
         call INC_Y.nL_
        djnz 1B
         pop hl
         ld a,h
         rrca : rrca : rrca
         and 3 : or #58
         ld h,a

         ld c,32        ; b=0

         call LDI_Nntrance
         call LDI_Nntrance
         add hl,bc

         ld c,32        ; b=0
         call LDI_Nntrance
         call LDI_Nntrance
         add hl,bc

         call LDI_Nntrance
         call LDI_Nntrance

         pop de,hl
        LD A,D
        XOR H
        AND 7
        XOR H
        LD H,A

        ld b,0        ; количество смещений спрайта-маски влево /DA
.Xrot  EQU $-1

        LD DE,(ARW_ADR)

         ld a,(ARW_YDISP)
         ld c,a
         ld a,(ARW_Y)
         sub c
         ld c,ARW_YR
        jr nc, LP2
         neg               ; если спрайт вылазит сверху за экран, то пропускаем верхние линии /DA
1
         inc de
         inc de
         dec c
         dec a
        jr nz,1B

LP2     EX DE,HL
        PUSH BC
        PUSH HL
        PUSH DE
        LD E,(HL)
        LD D,#FF
        INC HL
        LD L,(HL)
        LD H,0
LP3     SLI E
        RL D
        ADD HL,HL
        DJNZ LP3
        LD B,H
        LD C,L
        POP HL
        LD A,(HL)
        AND D
        XOR B
        LD (HL),A
        INC L
        LD A,L
        AND #1F
        JR Z,ZERO_4
        LD A,(HL)
        AND E
        XOR C
        LD (HL),A
ZERO_4  DEC L
       ; DHL_          ; экономим на процедуре /DA v 3.12
         call INC_Y
        POP DE
        POP BC
        INC DE
        INC DE
        LD A,H
        CP #58
        RET NC
        DEC C
        JR NZ,LP2
        RET


GetArw                  ; восстановление
          ld de,(XPLACE)
          ld hl,PLACE
          push de
          ld bc,#03FF
1         ld a,d
          cp #58
         jr nc,4F
          ld a,b
          ld b,8
2         ldi : ldi
          dec de : dec de
          inc d
         djnz 2B
          ld b,a
          ld a,e
          add a,32
          ld e,a
         jr c,3F
          ld a,d
          sub 8
          ld d,a
3        djnz 1B
4         pop de
          ld hl,PLACE+(3*2*8)
          ld a,d
          rrca : rrca : rrca
          and 3 : or #58
          ld d,a
          ld b,3
1         cp #5B
         ret nc
          ldi : ldi
          ld a,30
          add a,e
          ld e,a
         jr nc,2F
          inc d
2         ld a,d
         djnz 1B
         ret



DIRSCN_gui
        CALL dirscn
        AND A
        CALL Z,MOUSDR
        RET


KEMPST         ld a,(KJOY)
               ld e,a
               or a
              ret z
               xor a
               ld (WNkeyGui.a_),a

               in a,(#1F)
               ld e,a
.msk EQU $+1 : and %11100000
               ld bc,joy_but3
               rla
               call c,kemp_add_btn
               dec bc
               rla
               call c,kemp_add_btn
               dec bc
               rla
              ret nc
kemp_add_btn   push af
               call Kbuttons
               pop af
              ret

Kbuttons      ; обработка дополнительных клавиш джойстика
              ld hl,CANCEL
              ld a,(bc)
              or a
             jr nz,1F
              set 4,e              ;0) fire
             ret
1             dec a
             jr nz,2F
              ld  a,(flF2cancel)   ;1) fire2/CANCEL
              or a
              ld a,1
             jr nz,3F
              ld hl,Fire2
              ld (hl),a
             ret
2             dec a
             jr nz,4F
              ld a,3               ;2) Cancel 3 - эмулирует 3-ю кнопку мыши, которая работает как CANCEL
3             or (hl)
              ld (hl),a
             ret
4             dec a
             jr nz,5F
              inc a                ; 3) set SS emulator for speed
              ld (dirscn.prSS_),a
             ret
5             ld a,(bc)
              ld (WNkeyGui.a_),a   ; выставляем код клавиши в LAST_KEY и не только
              ld (LAST_KEY),a
             ret


dirscn   xor a
         ld h,a
         ld l,a
         ld (FIRE),hl     ; FIRE = CANCEL = 0
         ld (Fire2),a
         ld (.prSS_),a

         call KEMPST

.prSS_ EQU $+1 :  ld a,0  ; joy SS ?
         or a
        jr nz,1F

         ld a,#7F     ; при удержании SS делаем медленный курсор /DA
         in a,(#FE)
         rra
         rra
         ld a,0
        jr c,.in
1
         call .in_

         and #0F
        jr z, .e
         ld a,0
.prSS  EQU $-1
         or a
        jr z,.e_
         ld a,e
         and #10
         ld e,a

.e_      ld a,1
.e       ld (.prSS),a
         ld a,e
         ld (DIRECT),a
        ret
.in     ld (.prSS),a
.in_
        LD A,#FE
        IN A,(#FE)
        RRCA
        JR NC,NODCT

        CALL SINC_R
NOSINC  OR E
        LD E,A
        CALL QAOPSP
        OR E
        LD E,A
EXDIR0  AND #1F
TODCT   LD (DIRECT),A
        RET

NODCT   XOR A
        JR TODCT

QAOPSP  LD   A,#7F
        IN   A,(#FE)
        RRCA
        RL   C
        LD   A,#FB
        IN   A,(#FE)
        RRCA
        RL   C
        LD   A,#FD
        IN   A,(#FE)
        RRCA
        RL   C
        LD   A,#DF
        IN   A,(#FE)
EXDIR1  RRCA
        RRCA
        RL   C
        RLCA
        RLCA
EXDIR2  RL   C
EXDIR3  LD   A,C
        CPL
        JR   EXDIR0


SINC_R  LD   A,#EF
        IN   A,(#FE)
        LD   B,3
LPSINC  RRCA
        RL   C
        DJNZ LPSINC
        JR   EXDIR1

;ARW_DEFAULT_gui        ; восстановление курсора по умолчанию /DA ; теперь в 'ResGUI.asm' v3.12



ARW_YR  EQU 10   ;высота стр. в пикс.
STPCNT  DEFB 0
LVLCNT  DEFB 0
SPDCNT  DEFB 0
DIROLD  DEFB 0
PLACE   DEFS 3*2*9    ;10*2     ;буфер (2*ARW_YR)

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

ExamNtrance_gui  ld a,(Nntrance) ; проверка антиневидимки выход a=0 - нет , a!=0 - есть
                 xor #C9
               ret



         ; in hl adr

LDI_Nntrance  ldi

Nntrance   dec hl
           ld a,h
           cp #5B
          jr nc,1F
           ld a,(hl)
           call .nflash_
          jr nz,1F
           ld a,l
           exx
           ld l,a
           exx
           ld a,h
           exx
           add a,a
           add a,a
           add a,a
           and #7F
           ld h,a
           xor a
          DUP 8
           ld (hl),a
           inc h
          EDUP
           exx
           ld a,#07
           xor (hl)
           ld (hl),a
1          inc hl
          ret

.nflash_   push bc
.flag_ EQU $+1 : ld c,0   ; 0 - no , 1 - transparent
           dec c
           pop bc
          ret nz
           bit 7,a
.bitFlsh  ret nz      ; [ret nz] / [ nop ]  ; пока не используется
           add a,a : add a,a : add a,a
           xor (hl)
           and #38
1         ret


NtrMloupe_      ; in a-color , bit 1 c - 0 - paper, 1 - ink , hl - addr
                ld (hl),a
                ld c,0
                call Nntrance.nflash_
               jr nz,1F
.stmodCT_ EQU $+1 : ld a,0   ; тип прозрачности
       ;         ld c,#18
       ;         rra
       ;        jr c,1F
                ld c,5 ;7
1               ld a,(hl)
                xor c
                ld (hl),a
               ret



