
; Listing9c1.s		Ein Blitt mit der Höhe von 1 und Modulo
; Linke Taste, um den Blitt auszuführen, rechts um zu 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 ; $83C0


Start:
	move.l	#Bitplane,d0		; Zeiger auf die "leere" Bitplane
	lea	Bplpointers,a1			; Bitplanepointer
	move.w	d0,6(a1)
	swap	d0
	move.w	d0,2(a1)

	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:
	btst	#6,$bfe001			; linke Mausetaste gedrückt?
	bne.s	Mouse

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

;	    /\  /\
;	.--/  \/  \---.
;	 \           /
;	._> (o)(o   <__.
;	 \  _C        /
;	 / /____,  )  \
;	'----\    /----`
;	      oooo
;	     /    \

	move.w	#$ffff,$44(a5)		; BLTAFWM wir werden es später erklären
	move.w	#$ffff,$46(a5)		; BLTALWM wir werden es später erklären
	move.w	#$09f0,$40(a5)		; BLTCON0 (Kanal A und D)
	move.w	#$0000,$42(a5)		; BLTCON1 wir werden es später erklären
	move.w	#0,$64(a5)			; BLTAMOD = 0 weil das Rechteck in der
								; Quelle aufeinanderfolgende Zeilen im Speicher hat
					
	move.w	#36,$66(a5)			; BLTDMOD 40-4=36 das Rechteck
								; das Ziel ist innerhalb einer Bitebene die
								; 20 Wörter oder 40 Bytes breit ist. 
								; Das kopierte Rechteck ist 2 Wörter breit, 
								; das sind 4 Bytes.
								; Der Wert des Modulo ist gegeben durch den
								; Unterschied zwischen den Breiten

	move.l	#Figur,$50(a5)		; BLTAPT  (an der Quellfigur fixiert)
	move.l	#Bitplane,$54(a5)	; BLTDPT  (Zeilen des Bildschirms)
	move.w	#(64*6)+2,$58(a5)	; BLTSIZE (Blitter starten !)
								; Jetzt werden wir eine Größe von
								; 2 Wörter x 6 Zeilen mit nur einem
								; Blitt kopieren mit den entsprechend
								; für den Bildschirm eingestellten Modulo.
Mouse2:
	btst	#2,$16(a5)			; rechte Maustaste gedrückt?
	bne.s	Mouse2

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

	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,0				; BPL1MOD
	dc.w	$10a,0				; BPL2MOD

	dc.w	$100,$1200			; BPLCON0 - 1 Bitplane lowres

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

	dc.w	$0180,$000			; COLOR00
	dc.w	$0182,$eee			; COLOR01

	dc.w	$ffff,$fffe			; Ende Copperlist

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

; Wir definieren in binär die Figur, die 16 Bits oder 2 Wörter breit und 6 Zeilen
; hoch ist. Beachten Sie, dass die Zeilen nacheinander im Speicher angeordnet sind.

Figur:
	dc.l	%00000000000000000000110001100000	; Zeile 1
	dc.l	%00000000000000000011000110000000	; Zeile 2
	dc.l	%00000000000000001100011000000000
	dc.l	%00000110000000110001100000000000
	dc.l	%00000001100011000110000000000000
	dc.l	%00000000011100011000000000000000	; Zeile 6

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

	SECTION	LEEREPLANE,BSS_C

Bitplane:
	ds.b	40*256				; Bitplane (alles Null) lowres

	end

*****************************************************************************

In diesem Beispiel sehen Sie, wie Sie ein Rechteck kopieren können.
Beachten Sie zuerst den Wert zum Schreiben der Größe des Rechtecks in BLTSIZE.
Achten Sie dann genau darauf wie die Modulo berechnet werden. Für die Quelle,
die beim Label "Figur" beginnt, sind die Zeilen des Rechtecks im Speicher
hintereinander angeordnet. Daher ist der Wert des Modulos für die Quelle
(Kanal A) 0.
Für das Ziel stattdessen, wenn wir das betreffende Rechteck innerhalb einer 
breiteren Bitebene kopieren müssen, sind die Zeilen nicht fortlaufend im
Speicher und daher müssen Sie einen Wert für das Modulo angeben, das wir 
mit der Formel berechnen, welche wir in der Lektion gesehen haben. 