Assembler-Inlines von Zündeln für den AtariST
(zurück zu Zündeln)



;              "SPRITE_T.IS"
;              Sprite-Routine mit Maskenberechnung, Löschen + Zeichnen
;              6.4.90

               .INCLUDE 'ATARI.IS'
               movem.l    d1-d4/a0-a4,-(sp)
;              9 Register=36
; +             40(sp) zalt% (w)
; +             42(sp) V:Bild$
; +             46(sp) z% (w)
; +             48(sp) t% (w) Verschiebefaktor
; +             50(sp) v_sprite% (variabler Sprite in Masken%-Inline)
; +             54(sp) loch

;Masken==>---------------------------------------------------------------
;                         d0 als Schleifenzähler
;                         d1 für t%
;                         d2 für z%
;                         d3 für 16-t%
;                         d4 für Maske $FFFF0000 und $FFFF
;                         a1 für V:Bild$
;                         a2 für Puffer

               move.w     48(sp),d1     ; Shift-Anzahl in d1
               move.w     d1,d3         ; für 16-t% in d3
               neg.w      d3            ; Werte für rechte Seite:
               addi.w     #16,d3        ; d1=16-t%
               lea.l      puffer,a2     ; Maskenpuffer in a2
               movea.l    42(sp),a1     ; Varptr:Bild$ in a1
               move.w     46(sp),d2     ; z% in d2
               move.l     #15,d0        ; Schleifenzähler
maske_l:       
               move.l     #$ffff0000,d4 ; Maske links in d4
               lsl.l      d3,d4         ; Verschieben um 16-t%
               and.l      0(a1,d2.w),d4 ; And(z% über Bild$ and Maske)
               adda.l     #80,a1        ; nächste Zeile
               move.l     d4,(a2)+      ; in Puffer aufheben
               dbf        d0,maske_l

               movea.l    42(sp),a1     ; wieder auf erste Zeile
               move.l     #15,d0        ; Schleifenzähler
maske_r:       
               move.l     #$ffff,d4     ; Maske rechts in d4
               lsr.l      d1,d4         ; Verschieben um t%
               and.l      2(a1,d2.w),d4 ; And(z%+2 über Bild$ and Maske)
               adda.l     #80,a1        ; nächste Zeile
               move.l     d4,(a2)+      ; in Puffer aufheben
               dbf        d0,maske_r

;Löschen==>--------------------------------------------------------------
;                         d0 als Schleifenzähler (nach Physbase)
;                         d1 für zalt%
;                         a0 als XBIOS(2)
;                         a1 als V:Bild$
;
               clr.l      d0
               Physbase 
               movea.l    d0,a0
               movea.l    42(sp),a1     ; a1 als Varptr:Bild$
               move.w     40(sp),d1     ; zalt in d1
               clr.l      d0            ;
               move.w     #15,d0        ; d0 als Schleifenzähler
               subi.w     #80,d1

loeschen:      addi.w     #80,d1
               move.l     0(a1,d1.w),0(a0,d1.w)   ; Bild$+zalt% nach XBios(2)+zalt%
               move.l     2(a1,d1.w),2(a0,d1.w)   ; rechte Seite
               dbf        d0,loeschen

;Zeichnen==>---------------------------------------------------------------
;                         d0 als Schleifenzähler
;                         d1 als t% ( neu initialisiert)
;                         d2 als Zwischenlager für Maske-MKL$
;                         d3 als 16-t% (von Maske)
;                         a0 für XBIOS(2)+z%
;                         a1 für Sprite (lea: Sprite-Form) (jetzt Masken%-Inl)
;                         a2 für Puffer (neu lea-lisiert)
;              a3 für Loch
;              d4 für Lochaddition
;
;.....neu.....................................
               clr.l      a4
               movea.l    42(sp),a4     ; V:bild$
               adda.w     46(sp),a4
               movea.l    54(sp),a3     ; Loch
;               lea.l      loch,a3
               clr.l      d4
;................................................
               adda.w     46(sp),a0     ; z% über Physbase
               movea.l    50(sp),a1     ; Variabler Sprite (neu 5.Mai)
;               lea.l      sprite,a1
               lea.l      puffer,a2
               move.w     48(sp),d1     ; t% wieder in d1
               suba.l     #80,a0        ; Einstieg mit -80
               move.w     #15,d0        ; Schleifenzähler
links:         
               adda.l     #80,a0        ; nächste Zeile
               move.l     (a1)+,d2      ; nächstes Long von Sprite
               lsr.l      d1,d2         ; Shift für linke Seite-Sprite
               add.l      (a2)+,d2      ; nächster Masken-MKL$
;....neu......................................................
               move.l     (a3)+,d4      ; Loch in d4
               lsr.l      d1,d4         ; Loch verschieben
               and.l      (a4),d4       ; Loch mit Bild and-en
               adda.l     #80,a4        ; Bildadresse erhöhen
               add.l      d4,d2         ; Loch zu Sprite addieren
;.............................................................
               move.l     d2,(a0)       ; nächster MKL$ von b$ auf Bildschirm
               dbf        d0,links      ; Schleifenzähler

               suba.l     #1280,a0      ; z% über Physbase erneuern
               suba.l     #64,a1        ; Anfang von b$
               suba.l     #1280,a4
               move.w     #15,d0        ; Schleifenzähler
               movea.l    54(sp),a3     ; Loch
;               lea.l      loch,a3
rechts:        
               adda.l     #80,a0        ; nächste Zeile
               move.l     (a1)+,d2      ; nächstes Long von Sprite
               lsl.l      d3,d2         ; Shift für rechte Seite-Sprite
               add.l      (a2)+,d2      ; nächster Masken-MKL$

;....neu......................................................
               move.l     (a3)+,d4      ; Loch in d4
               lsl.l      d3,d4         ; Loch verschieben
               and.l      2(a4),d4      ; Loch mit Bild and-en
               adda.l     #80,a4        ; Bildadresse erhöhen
               add.l      d4,d2         ; Loch zu Sprite addieren
;.............................................................


               move.l     d2,2(a0)      ; nächster MKL$ von b$ auf Bildschirm
               dbf        d0,rechts     ; Schleifenzähler

               movem.l    (sp)+,d1-d4/a0-a4
               rts        

puffer:        
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0
               .DC.l $0

               .END 


sprite2:                  ; Kasten mit Grau
               .DC.l $1
               .DC.l $3
               .DC.l $15555557
               .DC.l $2aaaaaab
               .DC.l $1ffffff7
               .DC.l $2fffffeb
               .DC.l $1c000007
               .DC.l $2c00000b
               .DC.l $1c000007
               .DC.l $2c00000b
               .DC.l $1c000007
               .DC.l $2800000b
               .DC.l $15555557
               .DC.l $2aaaaaab
               .DC.l $7fffffff
               .DC.l $ffffffff