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