

; Кнопочки вывод (теперь совмещен со спрайтиками ) /DA

SprtIX  EQU  BUFF     ; храним в буфере распакованные параметры текущего спрайта
.x      EQU  SprtIX
.y      EQU  SprtIX+1
.sx     EQU  SprtIX+2
.sy     EQU  SprtIX+3
.rgb    EQU  SprtIX+4
.flg    EQU  SprtIX+5
.adr    EQU  SprtIX+6

; Кнопочки
DrwBut       push ix
             ld hl,(ButAdr)
             ld de, #003E    ; [ for nop and ld a,* ]
            jr 1F

; Спрайтики
DrwSprt      push ix
             ld hl,(SpritADR)
             ld de,#C828     ; [ for ret z  and  jr z,.sl1 ]

1            ld a,e
             ld (.sJ1),a
             ld a,d
             ld (.sRETz),a
             CPHL0
            jr z,.pIX
             push hl
             pop ix
             call .drwsprt
.pIX         pop ix
            ret

.obrSPR_    jp .drwspr_     ; адрес меняется в зависимости от
.obrSPRadr EQU $-2

.drwspr_     ld a,(ix+5)
             bit 7,a       ; блокируем вывод спрайта
            ret nz
             ld d,(ix+7)
             ld e,(ix+6)   ; de -addr of sprite
             bit 0,a
.sJ1        jr z,.sl1          ; [ ld a,* ] or [ jr z,.sl1 ] если спрайт атрибутов
             call ToScrOfI
             bit 1,(ix+5)
.sRETz      ret z              ; [ nop ] or [ ret z ] игнор цвета
             call RealWin_gui
             ld a,(ix+4)
             ld c,(ix+3)
             ld b,(ix+2)
            jp SetAtr_gui
.sl1
             push de          ; вывод спрайта атрибутов
             call RealWin_gui
            jp LoadWA.adr

 ;------

.drwsprt     ld a,(ix+0)
             ld b,a
             inc a
            ret z
             bit 6,b
            jr nz,.drwsprtGR     ; если уплотнённый режим

             call .obrSPR_
             ld bc,8
             add ix,bc
            jr .drwsprt

.drwsprtGR   inc ix
             ld a,b
             and #1F
             ld (.snums_),a    ; количество повторений
             ld a,b
             and %00100000 ; F - одинаковые флаги ?
             ld a,#18  ; [ jr * ]
            jr nz,1F
             ld a,#3E  ; [ ld a,* ]
1            ld (.svFLG),a
             push ix
             pop hl
             ld de,SprtIX
             push de
             ld bc,8
             ldir
             push hl
             pop ix
             pop hl
             ld bc,#183E ; b = 1:[ jr * ] , c = 0:[ ld a,* ]

             ld a,(hl)  ; x=%SSAxxxxx
             ld e,a
             bit 5,e      ; %A - address
             ld a,b
            jr nz,1F
             ld a,c
1            ld (.svADR),a
             ld d,1       ; for [ ld bc,**** ]
             ld a,e
             and %1100000 ; %SS - размер + последовательность
            jr nz,1F
             ld a,c
             ld (.svXY),a
            jr 4F
1            cp %11000000
             ld a,b
             ld (.svXY),a
             ld a,c
            jr z,4F
             ld d,#CD     ; for [ call **** ]
             ld a,#23  ; [ inc hl ]
             bit 7,e
            jr nz,2F
             xor a     ; [ nop ]
2            ld (.svStep),a
3            ld a,b
4            ld (.svSYZE),a
             ld a,d
             ld (.svSTEP),a
             ld a,e
             and #1F
             ld (hl),a
             inc hl

             ld a,(hl)   ; y=%CLLyyyyy
             ld e,a
             rla        ; %C
             ld d,a
             ld a,c
            jr nc,1F
             ld a,b
1            ld (.svRGB),a
             ld a,d
             rlca : rlca
             and 3
             ld (.svStepADD),a
             ld a,e
             and #1F
             ld (hl),a

             push ix
             ld ix,SprtIX
             call .obrSPR_
             pop de   ; ix
                                        ; обработка группы
.snums_ EQU $+1 : ld a,0   ; количество

.lsv0        dec a
            jr z,ng_            ;
             push af

.svXY       jr .svSYZE           ; [ jr #disp ] / [ ld a,#disp ]
             ld a,(de)           ; x, y   нее неее
             ld l,a
             inc de
             ld a,(de)
             inc de
             ld h,a
             ld (SprtIX.x),hl

.svSYZE     jr .svRGB            ; [ jr #disp ] / [ ld a,#disp ]
             ld a,(de)           ; sx , sy
             ld l,a
             inc de
             ld a,(de)
             inc de
             ld h,a
             ld (SprtIX.sx),hl

.svRGB      jr .svFLG           ; [ jr #disp ] / [ ld a,#disp ]
             ld a,(de)
             inc de
             ld (SprtIX.rgb),a

.svFLG      jr .svADR           ; [ jr #disp ] / [ ld a,#disp ]
             ld a,(de)
             inc de
             ld (SprtIX.flg),a

.svADR      jr 1F               ; [ jr #disp ] / [ ld a,#disp ]
             ld a,(de)
             ld l,a
             inc de
             ld a,(de)
             inc de
             ld h,a
             ld (SprtIX.adr),hl

1            push hl,de
             ld hl,SprtIX
             push hl
             pop ix
.svSTEP      call .svStep  ; [ call .svStep ] / [ ld bc,.svStep ] - смещение координат для линии спрайтов
             call .obrSPR_
             pop de,hl

             pop af
            jr .lsv0

.ng_         push de
             pop ix
            jp .drwsprt
;----------------------

.svStep      nop ;   [ nop ] / [ inc hl ]      ;
             ld a,(hl)
             ld c,a
             inc hl
             inc hl
             add a,(hl) ; смещение за спрайт
             add a,0
.svStepADD EQU $-1      ; пропуск между спрайтами
             dec hl
             dec hl
             ld (hl),a
            ret

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

; Обработчик кнопулечек

Button_gui
        PUSH IX
        CALL SetINXY
        XOR A
        LD (But),A
        CALL button
         ld hl,DrwSprt.drwspr_
         ld (DrwSprt.obrSPRadr),hl
        POP IX
        RET


NoBut   LD A,#FF
        LD (But),A
        RET

button  LD HL,(ButAdr)
        CPHL0
        JR Z,NoBut
        ld a,(hl)
        inc a
       jr z,NoBut

        push hl
        pop ix
         ld hl,.butsel
         ld (DrwSprt.obrSPRadr),hl
         ld (.sp),sp
         call DrwBut
        jr NoBut

.setbut_
.sp EQU $+1 : ld sp,#0000

              ld ix,#0000
.btIX_ EQU $-2
          bit 0,(ix+5)
         ret z
          ld e,(ix+6)
          ld d,(ix+7)
          push de
          call ToScrOnI   ; CALL ToScrOn
          halt
          halt
          halt
          call NOKEY_gui
          pop de

         jp ToScrOfI

.butsel   ld (.btIX_),ix
          ld de,(INXY)
          call lookbox
         jr c,1F
          ld a,(ix+5)
          bit 7,a
         jr nz,1F
          bit 1,a
         jr z,1F
         jr .setbut_
1         ld hl,But
          inc (hl)
         ret
;---------------------------------






