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