; процедуры вывода спрайта, части спрайта

; (IX) - DB X,Y,DX,DY     ; {0,1,2,3} координаты вывода и размер окна вывода в пикселях
;        DB Xs,Ys,SX,SY   ; {4,5,6,7} смещение в спрайте Xs - по байтно( x8 ), Ys - попиксельно
;                         ;           SX,SY - размер спрайта SX - побайтно , SY - попиксельно

;  DE                     ; aspr  - адрес спрайта в памяти
;  DE'                    ; amsk  - адрес маски спрайта если используется
;  A                      ; %mc   - флаги

SPRT               ; программы вывода спрайта на экран





.put_win7      push af
               ld a,7
               push hl
               push de
               push bc
               call .put_win
              jr 1F
.putA_win7     push af
               ld a,7
               push hl
               push de
               push bc
               call .putA_win
1              pop bc
               pop de
               pop hl
               pop af
              ret




.put_win           ; вывод простого спрайта в максимуме квадратного окна
               ; in de - координаты d=x e=y, HL - адрес спрайта, bc - размер спрайта, a - размер окна
               call .q_win
              ret z
               push bc
.BgOUT         call .bgout     ; меняем #CD (call nn) на #01 (ld bc,nn)
               pop bc
.put_full_      ld de,#4000
.putScrAdr  EQU $-2
.put_               ; вывод простого спрайта на экран DE из адреса HL  A - dy pix, C - sx bytes
                exx
                ld b,a    ; dy линии
.l1             exx
                push hl
                push de
                 ld b,1
.dXbyte  EQU $-1                     ; ширина выводимого окна спрайта (не должна превышать ширину спрайта)
.l2              ld a,(de)
                 call .Mnop
.mode          EQU $-2      ; в зависимости от режима разные процедуры
                 ld (de),a
                 inc e
                 inc hl
                djnz .l2
                pop de
                pop hl
                 inc d         ; вычисляем новую линию
                 ld a,d
                 and 7
                 ld a,d
                jr nz,.l3
                 ld a,e
                 sub #E0
                 ld e,a
                 sbc a,a
                 and #F8
                 add a,d
                 ld d,a
.l3              cpl
                 and #18
               ret z       ; экран кончился
                add hl,bc  ; следующая линия спрайта (b=0 after djnz)
                exx
               djnz .l1
                exx
               ret

           ; режимы вывода пикселей
.Mput           ld a,(hl)
               ret
.Mor            or (hl)
               ret
.Mxor           xor (hl)
               ret
.Mand           and (hl)
               ret
.Mres           or (hl)
                xor (hl)
.Mnop          ret


.putA_win      ; вывод простого спрайта атрибутов в максимуме квадратного окна
               ; in de - координаты d=x e=y, HL - адрес спрайта, bc - размер спрайта, a - размер окна
               call .q_win
              ret z
.putA_full_    ld de,#5800
.AputScrAdr  EQU $-2
               ld a,b
.putA_            ; вывод простого спрайта атрибутов на экран DE из адреса HL ; a - sy
               exx
               ld b,a   ; dy строки
.la1           exx
               push hl
               push de
                ld b,1
.dXbyte_ EQU $-1             ; ширина выводимого окна спрайта атрибутов (не должна превышать ширину спрайта)
.la2            ld a,(de)
                call .Anop
.modeA     EQU $-2           ; процедура вывода атрибутов
1               ld (de),a
.la3            inc e
                inc hl
               djnz .la2
               pop hl
                ld de,32  ; вычисляем новую строку
                add hl,de
               pop de
                ex de,hl
                bit 2,d
               ret nz     ; экран кончился
                add hl,bc  ; следующая строка атрибутов (b=0 after djnz)
                exx
               djnz .la1
                exx
               ret


     ; режимы вывода атрибутов
.Aput          ld a,(hl)
              ret

.Atran         ld a,(hl)
               or a
              ret nz
               ld a,(de)
              ret

.Atmsk         ld a,(hl)
               or a
               ld a,(de)
              ret z
.Amsk          and 0
.Amsk_Skr  EQU $-1        ; маска для экрана
               ld (.Amsk_t),a
               ld a,(hl)
               and 0
.Amsk_Atr  EQU $-1
               or 0
.Amsk_t   EQU $-1
.Anop         ret



.q_win         call RealWin
               cp b
              jr nc,1F
               ld b,a       ; sy
1              cp c
              jr c,.q_dXb_
.q_dXc_        ld a,c       ; sx
.q_dXb_        ld (.dXbyte),a
               ld (.dXbyte_),a

               push hl  ; in de -  d=x e=y, bc - размер спрайта
               call RASCH
               ld (.putScrAdr),hl
               call RASCHA_
               ld (.AputScrAdr),hl
               pop hl

               ld a,b
               add a,a
               add a,a
               add a,a
               inc b        ; выход флаг fZ = error
               dec b
              ret z
               inc c
               dec c
              ret

.q_full                   ; in de - d=x, e=y , b=sy ,c=sx
              ld a,e     ; y
              add a,b
              cp 25
             jr c,1F
              ld a,24      ; коррекция y
              sub e
              ld b,a
1             ld a,d     ; x
              add a,c
              cp 33
             jr c,.q_dXc_
              ld a,32
              sub d
             jr .q_dXb_

.q_Amode      ; in A' = Amsk, a = trans
              ld l,a
              ex af,af'
              inc l
              dec l
             jr nz,1F
              ld hl,SPRT.Aput
              cp #FF
             jr z,2F
              ld hl,SPRT.Amsk
             jr 2F
1             ld hl,SPRT.Atran
              cp #FF
             jr z,2F
              ld hl,SPRT.Atmsk
2             ld (SPRT.modeA),hl
              ld (SPRT.Amsk_Atr),a
              cpl
              ld (SPRT.Amsk_Skr),a
             ret

.bgout         push af
               ld c,b
               ld a,(.dXbyte)
               ld b,a
               ld a,7
.BgAtr  EQU $-1               ; атрибут фона для вывода спрайта
               call SetV_
               pop af
              ret


t_IX_  DB 0,0,0,0     ; временный буфер

StWSpr      push bc         ; вывод спрайта в окно
            push de         ; in: d-x , e-y , c - sx , b - sy , hl - addres
            push hl
            call RealWin
            ld l,d
            ld h,e
            ld (t_IX_),hl
            ld (t_IX_+2),bc
            pop de
            push ix
            ld ix,t_IX_
            call LoadWS
            ex de,hl      ; выход hl - адрес за спрайтом
            pop ix
            pop de
            pop bc
           ret

;Sprites.asm(970): error: Label not found: StWSpr
;Sprites.asm(978): error: Label not found: StWSpr
;Sprites.asm(1043): error: Label not found: StWSpr

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

ForAniLdPrtScr  ld a,SuxPage|#10
                call Ram
                call LdPrtSCR
                ld a,AddPage|#10
              jp Ram
