
; Listing10m2.s		Universalroutine Bob - Version interleaved
; linke Taste zum Beenden.

	SECTION	BLIT,CODE

;	include	"DaWorkBench.s"	; entferne das ; vor dem Speichern mit "wo"

*****************************************************************************
	include	"/Sources/startup1.s"	; speichern Copperlist etc.
*****************************************************************************

			;5432109876543210
DMASET	equ	%1000001111000000	; Bitplane, Copper, Blitter DMA


Start:
	move.l	#Bitplane,d0		; Zeiger auf die "leeren" Bitplanes
	lea	Bplpointers,a1			; Bitplanepointer
	moveq	#2-1,d1				; Anzahl der Bitplanes (hier sind es 2)
PointBp:
	move.w	d0,6(a1)
	swap	d0
	move.w	d0,2(a1)
	swap	d0
	add.l	#40,d0				; + Länge Reihe
	addq.w	#8,a1
	dbra	d1,PointBp

	lea	$dff000,a5				; Custom Register Base in a5
	move.w	#DMASET,$96(a5)		; DMACON - einschalten Bitplane, Copper, Blitter
	move.l	#Copperlist,$80(a5)	; Zeiger Copperlist
	move.w	d0,$88(a5)			; Start Copperlist
	move.w	#0,$1fc(a5)			; AGA "deaktivieren"
	move.w	#$c00,$106(a5)		; AGA "deaktivieren"
	move.w	#$11,$10c(a5)		; AGA "deaktivieren" 

Mouse:

; Parameter für Hintergrund speichern

	move.w	ObjX(pc),d0			; Position X
	move.w	ObjY(pc),d1			; Position Y
	move.w	#32,d2				; Dimension X
	move.w	#30,d3				; Dimension Y
	bsr.w	SaveBackground		; Speichere den Hintergrund

; Parameter für UniBob-Routinen

	move.l	FrameTab(pc),a0		; setzt den Zeiger auf den frame
								; in a0 zum Zeichnen
	lea	2*4*30(a0),a1			; Zeiger auf die Maske in a1
	move.w	ObjX(pc),d0			; Position X
	move.w	ObjY(pc),d1			; Position Y
	move.w	#32,d2				; Dimension X
	move.w	#30,d3				; Dimension Y
	bsr.w	UniBob			    ; zeichne den Bob mit der 
								; universal Routine

	move.l	#$1ff00,d1			; Bit zur Auswahl durch UND
	move.l	#$13000,d2			; Warte auf Zeile $130 (304)
WarteY1:
	move.l	4(a5),d0			; VPOSR und VHPOSR - $dff004/$dff006
	and.l   d1,d0				; Wählen Sie nur die Bits der vertikalen Pos.
	cmp.l   d2,d0				; Warte auf Zeile $130 (304)
	bne.s	WarteY1

; Parameter für die Routine Hintergrund wiederherstellen

	move.w	ObjX(pc),d0			; Position X
	move.w	ObjY(pc),d1			; Position Y
	move.w	#32,d2				; Dimension X
	move.w	#30,d3				; Dimension Y
	bsr.w	RestoreBackground	; stelle den Hintergrund wieder her

	bsr.s	MoveObject			; Verschiebe das Objekt auf dem Bildschirm
	bsr.s	Animation			; verschiebe die Rahmen in der Tabelle

	btst	#6,$bfe001			; linke Maustaste gedrückt?
	bne.s	Mouse				; wenn nicht, gehe zurück zu Mouse:
	rts
	
;****************************************************************************
; Diese Routine bewegt den Bob auf dem Bildschirm.
;****************************************************************************

MoveObject:
	addq.w	#1,ObjX				; Verschiebe den Bob nach rechts
	cmp.w	#320-32,ObjX		; hat es die rechte Kante erreicht?
	bls.s	EndMove				; wenn kein Ende
	clr.w	ObjX				; ansonsten von links starten
EndMove
	rts

;****************************************************************************
; Diese Routine erstellt die Animation und verschiebt die Frameadressen
; so dass jedes Mal, der erste zum letzten Platz der Tabelle geht,
; die anderen liegen alle in der Richtung des ersten
;****************************************************************************

Animation:
	addq.b	#1,CounterAnim		; Diese drei Anweisungen machen das die
	cmp.b	#4,CounterAnim		; Frames immer einmal geändert werden
	bne.s	DoNotChange			; 3x nein und 1 x ja
	clr.b	CounterAnim			; für die Geschwindigkeit der Animation
	lea	FrameTab(pc),a0			; Tabelle mit den Adressen der 4 Bilder
	move.l	(a0),d0				; Speichere die erste Adresse in d0
	move.l	4(a0),(a0)			; verschiebe die anderen Adressen zurück
	move.l	4*2(a0),4(a0)		; Diese Anweisungen "rotieren" die Adressen
	move.l	4*3(a0),4*2(a0)		; von der Tabelle.
	move.l	d0,4*3(a0)			; Stelle die erste Adresse auf den achten Platz

DoNotChange:
	rts

CounterAnim:
	dc.w	0

; Dies ist die Frame-Adressentabelle. Die Adressen die in der Tabelle 
; vorhanden sind rotieren innerhalb der Animationsroutine. so dass
; der erste in der Tabelle das erste Mal Frame1 ist, durch die Rotation
; dann Frame2, dann die 3,4 und dann wieder der erste, immer zyklisch.
; Auf diese Weise nehmen Sie einfach die Adresse, die am Anfang der 
; Tabelle steht.

FrameTab:
	dc.l	Frame1
	dc.l	Frame2
	dc.l	Frame3
	dc.l	Frame4

; BOB-Positionsvariablen
ObjY:		dc.w	100			; das Y des Objekts wird hier gespeichert
ObjX:		dc.w	50			; das X des Objekts wird hier gespeichert

;***************************************************************************
; Dies ist die universelle Routine zum Zeichnen von Bobs in Form und Größe
; willkürlich. Alle Parameter werden über Register weitergegeben.
; Die Routine funktioniert auf einem normalen Bildschirm
;
; a0 - Adresse Figur bob
; a1 - Bobmaskenadresse
; d0 - X Koordinate des oberen linken Eckpunkts
; d1 - Y-Koordinate des oberen linken Eckpunkts
; d2 - Rechteckbreite in Pixel
; d3 - Rechteckhöhe
;****************************************************************************

;	       ___  Oo          .:/
;	      (___)o_o        ,,///;,   ,;/
;	 //====--//(_)       o:::::::;;///
;	         \\ ^       >::::::::;;\\\
;	                      ''\\\\\'" ';\

UniBob:

; Berechnung der Startadresse des Blitters

	lea	Bitplane,a2				; Adresse Bitplane
	mulu.w	#2*40,d1			; Adresse berechnen: Jede Zeile besteht aus
								; 2 Ebenen von jeweils 40 Bytes
	add.l	d1,a2				; zur Adresse hinzufügen
	move.w	d0,d6				; kopiere das X
	lsr.w	#3,d0				; teile das X durch 8
	and.w	#$fffe,d0			; mach es gerade
	add.w	d0,a2				; addieren zur Adresse der Bitebene, 
								; um die richtige Zieladresse zu finden

	and.w	#$000f,d6			; wähle die ersten 4 Bits des X aus
; Sie müssen in den Shifter der Kanäle A, B eingefügt werden 
	lsl.w	#8,d6				; Die 4 Bits werden zum High-Nibble bewegt
	lsl.w	#4,d6				; des Wortes. Dies ist der Wert von BLTCON1

	move.w	d6,d5				; kopieren, um den Wert von BLTCON0 zu berechnen
	or.w	#$0FCA,d5			; Werte, die in BLTCON0 gesetzt werden sollen

; berechnet den Versatz zwischen den Ebenen der Figur
	lsr.w	#3,d2				; dividiere die Breite durch 8
	and.w	#$fffe,d2			; Ich nulle Bit 0 (ich bin gerade)
	addq.w	#2,d2				; Der Blitt ist 1 Wort mehr
	move.w	#40,d4				; Bildschirmbreite in Bytes
	sub.w	d2,d4				; Modulo=Breite Bildschirm-Breite Rechteck

; Berechnung Dimension Blitt

	mulu	#2,d3				; Multipliziere die Höhe mit der Anzahl der Ebenen
								; (für interleaved Bildschirm)
								; In diesem Fall haben wir 2 Bitplanes
								; Man könnte ASL benutzen, aber im Allgemeinen
								; (zB 3 Bitplanes) muss das MULU benutzt werden
	lsl.w	#6,d3				; Höhe multipliziert mit 64
	lsr.w	#1,d2				; Pixelbreite geteilt durch 16
								; das heißt, Breite in Worten
	or	d2,d3					; lege die Dimension zusammen

; initialisiere die Register
	btst	#6,2(a5)
WaitBlit1:
	btst	#6,2(a5)			; warte auf das Ende des Blitters
	bne.s	WaitBlit1

	move.l	#$ffff0000,$44(a5)	; BLTAFWM = $ffff Es passiert alles
								; BLTALWM = $0000 setzt das letzte Wort zurück

	move.w	d6,$42(a5)			; BLTCON1 - Verschiebungswert
								; kein besonderer Modi

	move.w	d5,$40(a5)			; BLTCON0 - Verschiebungswert
								; cookie-cut

	move.l	#$fffefffe,$62(a5)	; BLTBMOD und BLTAMOD=$fffe=-2
								; zurück zum Anfang der Zeile

	move.w	d4,$60(a5)			; BLTCMOD berechneter Wert
	move.w	d4,$66(a5)			; BLTDMOD berechneter Wert

	move.l	a1,$50(a5)			; BLTAPT (Maske)
	move.l	a2,$54(a5)			; BLTDPT (Bildschirm)
	move.l	a2,$48(a5)			; BLTCPT (Bildschirm)
	move.l	a0,$4c(a5)			; BLTBPT (Figur bob)
	move.w	d3,$58(a5)			; BLTSIZE (Blitter starten!)

	rts

;****************************************************************************
; Diese Routine kopiert das Hintergrundrechteck, das mit dem BOB überschrieben 
; wird in einen Puffer. Die Routine behandelt einen Bob beliebiger Größe.
; Wenn Sie diese Routine für Bobs unterschiedlicher Größe verwenden, seien Sie 
; vorsichtig dass der Puffer die maximale Größe des Bobs halten kann!
; Die Position und Größe des Rechtecks sind Parameter
;
; d0 - X Koordinate des oberen linken Eckpunkts
; d1 - Y-Koordinate des oberen linken Eckpunkts
; d2 - Rechteckbreite in Pixel
; d3 - Rechteckhöhe
;****************************************************************************

SaveBackground:
; Berechnung der Startadresse des Blitters

	lea	Bitplane,a1				; Adresse Bitplane
	mulu.w	#2*40,d1			; Adresse berechnen: Jede Zeile besteht aus
								; 2 Ebenen von jeweils 40 Bytes
	add.l	d1,a1				; zur Adresse hinzufügen
	lsr.w	#3,d0				; teile das X durch 8
	and.w	#$fffe,d0			; mach es gleich
	add.w	d0,a1				; addieren zur Adresse der Bitebene, 
								; um die richtige Zieladresse zu finden

; Berechnung Modulo Blitter
	lsr.w	#3,d2				; dividiere die Breite durch 8
	and.w	#$fffe,d2			; Ich nulle Bit 0 (ich bin gerade)
	addq.w	#2,d2				; Der Blitt ist 1 Wort mehr
	move.w	#40,d4				; Bildschirmbreite in bytes
	sub.w	d2,d4				; Modulo=Breite Bildschirmbreite Rechteck

; Berechnung Dimension Blitt
	mulu	#2,d3				; Multipliziere die Höhe mit der Anzahl der Ebenen
								; (für interleaved Bildschirm)
								; In diesem Fall haben wir 2 Bitplanes
								; Man könnte ASL benutzen, aber im Allgemeinen
								; (zB 3 Bitplanes) muss das MULU benutzt werden
	lsl.w	#6,d3				; Höhe multipliziert mit 64
	lsr.w	#1,d2				; Pixelbreite geteilt durch 16
								; das heißt, Breite in Worten
	or	d2,d3					; lege die Dimension zusammen

	lea	Buffer,a2				; Adresse Ziel

	btst	#6,2(a5)			; DMACONR
WaitBlit2:
	btst	#6,2(a5)			; DMACONR - warte auf das Ende des Blitters
	bne.s	WaitBlit2

	move.l	#$ffffffff,$44(a5)	; BLTAFWM = $ffff es passiert alles
								; BLTALWM = $ffff es passiert alles

	move.l	#$09f00000,$40(a5)	; BLTCON0 und BLTCON1 Kopie von A nach D
	move.w	d4,$64(a5)			; BLTAMOD berechneter Wert
	move.w	#0,$66(a5)			; BLTDMOD=0 Puffer
	move.l	a1,$50(a5)			; BLTAPT - Adresse Quelle
	move.l	a2,$54(a5)			; BLTDPT - Puffer
	move.w	d3,$58(a5)			; BLTSIZE (Blitter starten !)

	rts

;****************************************************************************
; Diese Routine kopiert den Inhalt des Puffers in das Bildschirmrechteck
; was es vor der BOB-Zeichnung enthielt. Auf diese Weise kommt es auch, das
; das BOB vom alten Standort gelöscht wird. Die Routine behandelt einen Bob 
; von willkürlicher Dimension.
; Wenn Sie diese Routine für Bobs unterschiedlicher Größe verwenden, seien Sie 
; vorsichtig dass der Puffer die maximale Größe des Bobs halten kann!
; Die Position und Größe des Rechtecks sind Parameter
;
; d0 - X Koordinate des oberen linken Eckpunkts
; d1 - Y-Koordinate des oberen linken Eckpunkts
; d2 - Rechteckbreite in Pixel
; d3 - Rechteckhöhe
;****************************************************************************

RestoreBackground:
; Berechnung der Startadresse des Blitters

	lea	Bitplane,a1				; Adresse Bitplane
	mulu.w	#2*40,d1			; Adresse berechnen: Jede Zeile besteht aus
								; 2 Ebenen von jeweils 40 Bytes
	add.l	d1,a1				; zur Adresse hinzufügen
	lsr.w	#3,d0				; teile das X durch 8
	and.w	#$fffe,d0			; mach es gerade
	add.w	d0,a1				; addieren zur Adresse der Bitebene, 
								; um die richtige Zieladresse zu finden

; Berechnung Modulo Blitter
	lsr.w	#3,d2				; dividiere die Breite durch 8
	and.w	#$fffe,d2			; Ich nulle Bit 0 (ich bin gerade)
	addq.w	#2,d2				; Der Blitt ist 1 Wort mehr
	move.w	#40,d4				; Bildschirmbreite in bytes
	sub.w	d2,d4				; Modulo=Breite Bildschirmbreite Rechteck

; Berechnung Dimension Blitt
	mulu	#2,d3				; Multipliziere die Höhe mit der Anzahl der Ebenen
								; (für interleaved Bildschirm)
								; In diesem Fall haben wir 2 Bitplanes
								; Man könnte ASL benutzen, aber im Allgemeinen
								; (zB 3 Bitplanes) muss das MULU benutzt werden
	lsl.w	#6,d3				; Höhe multipliziert mit 64
	lsr.w	#1,d2				; Pixelbreite geteilt durch 16
								; das heißt, Breite in Worten
	or	d2,d3					; lege die Dimension zusammen

	lea	Buffer,a2				; Adresse Ziel

	btst	#6,2(a5)			; DMACONR
WaitBlit3:
	btst	#6,2(a5)			; DMACONR - warte auf das Ende des Blitters
	bne.s	WaitBlit3

	move.l	#$ffffffff,$44(a5)	; BLTAFWM = $ffff es passiert alles
								; BLTALWM = $ffff es passiert alles

	move.l	#$09f00000,$40(a5)	; BLTCON0 und BLTCON1 Kopie von A nach D
	move.w	d4,$66(a5)			; BLTDMOD berechneter Wert
	move.w	#0,$64(a5)			; BLTAMOD=0 Puffer
	move.l	a2,$50(a5)			; BLTAPT - Puffer
	move.l	a1,$54(a5)			; BLTDPT - Bildschirm
	move.w	d3,$58(a5)			; BLTSIZE (Blitter starten!)

	rts


;****************************************************************************

	SECTION	GRAPHIC,DATA_C

Copperlist:
	dc.w	$8e,$2c81			; DIWSTRT
	dc.w	$90,$2cc1			; DIWSTOP
	dc.w	$92,$38				; DDFSTRT
	dc.w	$94,$d0				; DDFSTOP
	dc.w	$102,0				; BPLCON1
	dc.w	$104,0				; BPLCON2
	dc.w	$108,40				; BPL1MOD
	dc.w	$10a,40				; BPL2MOD

	dc.w	$100,$2200			; BPLCON0

Bplpointers:
	dc.w	$e0,$0000,$e2,$0000	; erste Bitplane
	dc.w	$e4,$0000,$e6,$0000

	dc.w	$180,$000			; COLOR00
	dc.w	$182,$00b			; COLOR01
	dc.w	$184,$cc0			; COLOR02
	dc.w	$186,$b00			; COLOR03

	dc.w	$ffff,$fffe			; Ende Copperlist

;****************************************************************************
; Dies sind die Frames, die die Animation ausmachen

Frame1:

	dc.l	$00000000,$00020000
	dc.l	$00000000,$00070000
	dc.l	$00000000,$000f8000
	dc.l	$00000000,$001fc000
	dc.l	$00000000,$003fe000
	dc.l	$00000000,$007ff000
	dc.l	$00000000,$00fff800
	dc.l	$00000000,$01fffc00
	dc.l	$00000000,$03fffe00
	dc.l	$00000000,$07ffff00
	dc.l	$07ffff00,$07ffff00
	dc.l	$07ffff00,$07ffff00
	dc.l	$07ffff00,$07ffff00
	dc.l	$07ffff00,$07ffff00
	dc.l	$07ffff00,$07ffff00
	dc.l	$07ffff00,$07ffff00
	dc.l	$07ffff00,$07ffff00
	dc.l	$07ffff00,$07ffff00
	dc.l	$07ffff00,$07ffff00
	dc.l	$07ffff00,$07ffff00
	dc.l	$00000000,$07ffff00
	dc.l	$00000000,$03fffe00
	dc.l	$00000000,$01fffc00
	dc.l	$00000000,$00fff800
	dc.l	$00000000,$007ff000
	dc.l	$00000000,$003fe000
	dc.l	$00000000,$001fc000
	dc.l	$00000000,$000f8000
	dc.l	$00000000,$00070000
	dc.l	$00000000,$00020000

; Maske
	dc.l	$00020000
	dc.l	$00020000
	dc.l	$00070000
	dc.l	$00070000
	dc.l	$000f8000
	dc.l	$000f8000
	dc.l	$001fc000
	dc.l	$001fc000
	dc.l	$003fe000
	dc.l	$003fe000
	dc.l	$007ff000
	dc.l	$007ff000
	dc.l	$00fff800
	dc.l	$00fff800
	dc.l	$01fffc00
	dc.l	$01fffc00
	dc.l	$03fffe00
	dc.l	$03fffe00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$07ffff00
	dc.l	$03fffe00
	dc.l	$03fffe00
	dc.l	$01fffc00
	dc.l	$01fffc00
	dc.l	$00fff800
	dc.l	$00fff800
	dc.l	$007ff000
	dc.l	$007ff000
	dc.l	$003fe000
	dc.l	$003fe000
	dc.l	$001fc000
	dc.l	$001fc000
	dc.l	$000f8000
	dc.l	$000f8000
	dc.l	$00070000
	dc.l	$00070000
	dc.l	$00020000
	dc.l	$00020000

Frame2:
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$001fffc0
	dc.l	$00300000,$003fffc0
	dc.l	$00780000,$007fffc0
	dc.l	$00fc0000,$00ffffc0
	dc.l	$01fe0000,$01ffffc0
	dc.l	$03ff0000,$03ffffc0
	dc.l	$07ff8000,$07ffffc0
	dc.l	$0fffc000,$0fffffc0
	dc.l	$07ffe000,$0fffffc0
	dc.l	$03fff000,$0fffffc0
	dc.l	$01fff800,$0fffffc0
	dc.l	$00fffc00,$0fffffc0
	dc.l	$007ffe00,$0fffffc0
	dc.l	$003fff00,$0fffffc0
	dc.l	$001fff80,$0fffff80
	dc.l	$000fff00,$0fffff00
	dc.l	$0007fe00,$0ffffe00
	dc.l	$0003fc00,$0ffffc00
	dc.l	$0001f800,$0ffff800
	dc.l	$0000f000,$0ffff000
	dc.l	$00006000,$0fffe000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000


	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$001fffc0
	dc.l	$001fffc0
	dc.l	$003fffc0
	dc.l	$003fffc0
	dc.l	$007fffc0
	dc.l	$007fffc0
	dc.l	$00ffffc0
	dc.l	$00ffffc0
	dc.l	$01ffffc0
	dc.l	$01ffffc0
	dc.l	$03ffffc0
	dc.l	$03ffffc0
	dc.l	$07ffffc0
	dc.l	$07ffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffff80
	dc.l	$0fffff80
	dc.l	$0fffff00
	dc.l	$0fffff00
	dc.l	$0ffffe00
	dc.l	$0ffffe00
	dc.l	$0ffffc00
	dc.l	$0ffffc00
	dc.l	$0ffff800
	dc.l	$0ffff800
	dc.l	$0ffff000
	dc.l	$0ffff000
	dc.l	$0fffe000
	dc.l	$0fffe000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000

Frame3:

	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$003ff000,$007ff800
	dc.l	$003ff000,$00fffc00
	dc.l	$003ff000,$01fffe00
	dc.l	$003ff000,$03ffff00
	dc.l	$003ff000,$07ffff80
	dc.l	$003ff000,$0fffffc0
	dc.l	$003ff000,$1fffffe0
	dc.l	$003ff000,$3ffffff0
	dc.l	$003ff000,$7ffffff8
	dc.l	$003ff000,$fffffffc
	dc.l	$003ff000,$7ffffff8
	dc.l	$003ff000,$3ffffff0
	dc.l	$003ff000,$1fffffe0
	dc.l	$003ff000,$0fffffc0
	dc.l	$003ff000,$07ffff80
	dc.l	$003ff000,$03ffff00
	dc.l	$003ff000,$01fffe00
	dc.l	$003ff000,$00fffc00
	dc.l	$003ff000,$007ff800
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000

	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$007ff800
	dc.l	$007ff800
	dc.l	$00fffc00
	dc.l	$00fffc00
	dc.l	$01fffe00
	dc.l	$01fffe00
	dc.l	$03ffff00
	dc.l	$03ffff00
	dc.l	$07ffff80
	dc.l	$07ffff80
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$1fffffe0
	dc.l	$1fffffe0
	dc.l	$3ffffff0
	dc.l	$3ffffff0
	dc.l	$7ffffff8
	dc.l	$7ffffff8
	dc.l	$fffffffc
	dc.l	$fffffffc
	dc.l	$7ffffff8
	dc.l	$7ffffff8
	dc.l	$3ffffff0
	dc.l	$3ffffff0
	dc.l	$1fffffe0
	dc.l	$1fffffe0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$07ffff80
	dc.l	$07ffff80
	dc.l	$03ffff00
	dc.l	$03ffff00
	dc.l	$01fffe00
	dc.l	$01fffe00
	dc.l	$00fffc00
	dc.l	$00fffc00
	dc.l	$007ff800
	dc.l	$007ff800
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000

Frame4:

	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00006000,$0fffe000
	dc.l	$0000f000,$0ffff000
	dc.l	$0001f800,$0ffff800
	dc.l	$0003fc00,$0ffffc00
	dc.l	$0007fe00,$0ffffe00
	dc.l	$000fff00,$0fffff00
	dc.l	$001fff80,$0fffff80
	dc.l	$003fff00,$0fffffc0
	dc.l	$007ffe00,$0fffffc0
	dc.l	$00fffc00,$0fffffc0
	dc.l	$01fff800,$0fffffc0
	dc.l	$03fff000,$0fffffc0
	dc.l	$07ffe000,$0fffffc0
	dc.l	$0fffc000,$0fffffc0
	dc.l	$07ff8000,$07ffffc0
	dc.l	$03ff0000,$03ffffc0
	dc.l	$01fe0000,$01ffffc0
	dc.l	$00fc0000,$00ffffc0
	dc.l	$00780000,$007fffc0
	dc.l	$00300000,$003fffc0
	dc.l	$00000000,$001fffc0
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000
	dc.l	$00000000,$00000000

	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$0fffe000
	dc.l	$0fffe000
	dc.l	$0ffff000
	dc.l	$0ffff000
	dc.l	$0ffff800
	dc.l	$0ffff800
	dc.l	$0ffffc00
	dc.l	$0ffffc00
	dc.l	$0ffffe00
	dc.l	$0ffffe00
	dc.l	$0fffff00
	dc.l	$0fffff00
	dc.l	$0fffff80
	dc.l	$0fffff80
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$0fffffc0
	dc.l	$07ffffc0
	dc.l	$07ffffc0
	dc.l	$03ffffc0
	dc.l	$03ffffc0
	dc.l	$01ffffc0
	dc.l	$01ffffc0
	dc.l	$00ffffc0
	dc.l	$00ffffc0
	dc.l	$007fffc0
	dc.l	$007fffc0
	dc.l	$003fffc0
	dc.l	$003fffc0
	dc.l	$001fffc0
	dc.l	$001fffc0
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000
	dc.l	$00000000

;****************************************************************************

	SECTION	LEEREPLANE,BSS_C

; Dies ist der Puffer, in dem wir den Hintergrund von Zeit zu Zeit speichern.
; Er hat die gleichen Abmessungen wie eine Blitt: Höhe 30 Zeilen, 
; Breite 3 Wörter, 2 Bitebenen

Buffer:
	ds.w	30*3*2

Bitplane:

; 2 planes 
	ds.b	40*256
	ds.b	40*256

;****************************************************************************

	end

In diesem Beispiel zeigen wir die rawblit Version der universellen Routine zum
Zeichnen von Bobs. Das Programm ist mit Listing10m1.s identisch mit dem
Unterschied das ein rawblit Bildschirm verwendet wird und als Ergebnis, wie Sie
wissen, ändern sich die Formeln für die Berechnung von Werten, die in die
Registern geschrieben werden müssen ein wenig.
In diesem Fall verwenden wir kein Hintergrundbild, welches die Routinen
speichern und wiederherstellen. Sie können sich ein Hintergrundbild (in
Rawblit-Version) zeichnen und es sich ohne es zu ändern in die Quelle legen!

