
; Listing9h4r.s		durch Scrollen nach rechts verschwindet ein Bild
; (im rawblit Format) durch Shift + BLTALWM Maske.
; rechte Taste um den Blitt zu starten, links 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 das Bild
	lea	Bplpointers,a1			; Bitplanepointer
	moveq	#3-1,d1				; Anzahl Bitplanes (hier sind es 3)
PointBp:
	move.w	d0,6(a1)
	swap	d0
	move.w	d0,2(a1)
	swap	d0
								; HIER IST DER ERSTE UNTERSCHIED
								; ZU DEN NORMALEN BILDERN !!!!!!
	add.l	#40,d0				; + LÄNGE EINER Zeile !!!!!
	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"

Mouse1:
	btst	#2,$dff016			; rechte Maustaste gedrückt?
	bne.s	Mouse1				; Wenn nicht, gehe zurück zu Mouse1:

	bsr.s	Scroll				; die Bildlaufroutine ausführen

Mouse2:
	btst	#6,$bfe001			; linke Maustaste gedrückt?
	bne.s	Mouse2				; Wenn nicht, gehe zurück zu Mouse2:

	rts


;******************************************************************************
; Diese Routine lässt ein Bild nach und nach verschwinden
; durch Verschieben nach rechts
;******************************************************************************

;	     .----------.
;	     ¦          ¦
;	     |          |
;	     |          |
;	     | ¯¯¯  --- |
;	    _l___    ___|_
;	   /   _¬\  / _  ¬\
;	 _/   ( °/--\° )   \_
;	/¬\_____/¯¯¯¯\_____/¬\
;	\ ____(_,____,_)____ /
;	 \_\ `----------' /_/
;	   \\___      ___//
;	    \__`------'__/
;	      |  ¯¯¯¯  | xCz
;	      `--------'

Scroll:
	move.w	#160-1,d7			; Die Schleife muss für jedes Pixel einmal ausgeführt 
								; werden, da das Bild 160 Pixel breit ist (10 Wörter)

; In diesem Beispiel kopieren wir ein Bild auf sich selbst, aber verschieben 
; es kontinuierlich um ein Pixel, um es fließen zu lassen.
; Daher sind die Quell- und Zieladressen identisch

	move.l	#Bitplane+((3*20*50)+64/16)*2,d0	; Adresse Quelle und Ziel

ScrollLoop:

; Warten Sie, bis das vblank das Bild um jeweils ein Pixel verschoben hat

WaitWblank:
	cmp.b	#$ff,$dff006		; VHPOSR - warte auf die Zeile 255
	bne.s	WaitWblank
WarteY:
	cmp.b	#$ff,$dff006		; VHPOSR - noch Zeile 255?
	beq.s	WarteY

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

	move.l	#$19f00000,$40(a5)	; BLTCON0 und BLTCON1 - Kopie von A nach D
								; mit einer Pixelverschiebung

	move.l	#$fffffffe,$44(a5)	; BLTAFWM und BLTALWM
								; BLTAFWM = $ffff - alles
								; BLTALWM = $fffe = %1111111111111110
								; lösche das letzte Bit

								; Lade die Zeiger
	move.l	d0,$50(a5)			; BLTAPT - Quelle
	move.l	d0,$54(a5)			; BLTDPT - Ziel

; Das Modulo wird wie gewohnt berechnet

	move.l	#$00140014,$64(a5)			; BLTAMOD und BLTDMOD 
	move.w	#(3*20*64)+160/16,$58(a5)	; BLTSIZE
								; Höhe 20 Zeilen und 3 Ebenen
								; 160 Pixel breit (= 10 Wörter)

	dbra	d7,ScrollLoop		; für alle Pixel wiederholen

	btst	#6,$02(a5)			; DMACONR - warte auf das Ende des Blitters
WaitBlit2:
	btst	#6,$02(a5)
	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

								; HIER IST DER ZWEITE UNTERSCHIED
								; ZU DEN NORMALEN BILDERN !!!!!!
	dc.w	$108,80				; WERT Modulo = 2*20*(3-1)= 80
	dc.w	$10a,80				; BEIDE MODULO MIT GLEICHEM WERT.

	dc.w	$100,$3200			; BPLCON0 - 3 Bitplanes lowres

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

	dc.w	$0180,$000			; COLOR00
	dc.w	$0182,$475			; COLOR01
	dc.w	$0184,$fff			; COLOR02
	dc.w	$0186,$ccc			; COLOR03
	dc.w	$0188,$999			; COLOR04
	dc.w	$018a,$232			; COLOR05
	dc.w	$018c,$777			; COLOR06
	dc.w	$018e,$444			; COLOR07

	dc.w	$ffff,$fffe			; Ende Copperlist

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

Bitplane:
	incbin	"/Sources/amiga.rawblit"	
						; hier laden wir die Figur in
						; RAWBLIT-Format (oder Interleaved-Format)
						; konvertiert mit KEFCON.
	end

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

Dieses Beispiel ist die Rawblit-Version von Listing9h4.s.
Vergleichen Sie die Unterschiede in den Formeln zur Berechnung der zu 
schreibenden Werte in die Blitter-Register.
