Assembler-Inlines von Zündeln für den AtariST
(zurück zu Zündeln)
; "laeufer3.IS"
; Sprite-Routine mit Maskenberechnung, Löschen + Zeichnen
; 6.4.90
.INCLUDE 'ATARI.IS'
movem.l d1-d4/a0-a3,-(sp)
; 8 Register=32
; 36(sp) zalt% (w)
; 38(sp) V:Bild$
; 42(sp) z% (w)
; 44(sp) t% (w) Verschiebefaktor
; neu: 46(sp) Masken-Inline (L:)
;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 (jetzt für Masken-Inline-Adresse
;
move.w 44(sp),d1 ; Shift-Anzahl in d1
move.w d1,d3 ; für 8-t% in d3
neg.w d3 ; Werte für rechte Seite:
addi.w #8,d3 ; d1=8-t%
lea.l puffer,a2 ; Maskenpuffer in a2
movea.l 38(sp),a1 ; Varptr:Bild$ in a1
move.w 42(sp),d2 ; z% in d2
move.l #7,d0 ; Schleifenzähler
maske_l:
move.b #$ff,d4 ; Maske links in d4
lsl.b d3,d4 ; Verschieben um 16-t%
and.b 0(a1,d2.w),d4 ; And(z% über Bild$ and Maske)
adda.l #80,a1 ; nächste Zeile
move.b d4,(a2)+ ; in Puffer aufheben
dbf d0,maske_l
movea.l 38(sp),a1 ; wieder auf erste Zeile
move.l #7,d0 ; Schleifenzähler
maske_r:
move.b #$ff,d4 ; Maske rechts in d4
lsr.b d1,d4 ; Verschieben um t%
and.b 1(a1,d2.w),d4 ; And(z%+2 über Bild$ and Maske)
adda.l #80,a1 ; nächste Zeile
move.b 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 38(sp),a1 ; a1 als Varptr:Bild$
move.w 36(sp),d1 ; zalt in d1
clr.l d0 ;
move.w #7,d0 ; d0 als Schleifenzähler
subi.w #80,d1
loeschen: addi.w #80,d1
move.b 0(a1,d1.w),0(a0,d1.w) ; Bild$+zalt% nach XBios(2)+zalt%
move.b 1(a1,d1.w),1(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)
; a2 für Puffer (neu lea-lisiert)
adda.w 42(sp),a0 ; z% über Physbase
movea.l 46(sp),a1 ; Masken-Inline-Adresse in a2
lea.l puffer,a2
move.w 44(sp),d1 ; t% wieder in d1
suba.l #80,a0 ; Einstieg mit -80
move.w #7,d0 ; Schleifenzähler
links:
adda.l #80,a0 ; nächste Zeile
move.b (a1)+,d2 ; nächster MKL$ von b$
lsr.b d1,d2 ; Shift für linke Seite-Sprite
add.b (a2)+,d2 ; nächster Masken-MKL$
move.b d2,(a0) ; nächster MKL$ von b$ auf Bildschirm
dbf d0,links ; Schleifenzähler
suba.l #640,a0 ; z% über Physbase erneuern
suba.l #8,a1 ; Anfang von b$
move.w #7,d0 ; Schleifenzähler
rechts:
adda.l #80,a0 ; nächste Zeile
move.b (a1)+,d2 ; nächster MKL$ von b$
lsl.b d3,d2 ; Shift für rechte Seite-Sprite
add.b (a2)+,d2 ; nächster Masken-MKL$
move.b d2,1(a0) ; nächster MKL$ von b$ auf Bildschirm
dbf d0,rechts ; Schleifenzähler
movem.l (sp)+,d1-d4/a0-a3
rts
puffer:
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.DC.b $0
.END