
; Listing15g2.s		- AGA Scroll von Bitplanes in Schritten von 1/4 Pixel,
; für maximal 64 Pixel.	Die 2 playfields bewegen sich
; unabhängig in diesem Beispiel.

; HINWEIS: Die 2 hohen Bits des Scrolls, welche das "Einrasten" von 16 oder 32 Pixel ermöglichen.
; Für maximal 64 Pixel Bildlauf funktionieren sie nur, wenn der Burst-Modus aktiviert ist
; bei 64 Pixel (durch Setzen der 2 niedrigen Bits von FMODE, dh $dff1fc).

	SECTION	AGARULEZ,CODE

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

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

		    ;5432109876543210
DMASET	equ	%1000001110000000	; Copper, Bitplane DMA

WaitDisk	equ	30				; 50-150 zur Rettung (je nach Fall)

Start:

;	Zeiger auf das AGA-Bild (planes gerade)

	move.l	#Picture1,d0
	lea	EvenBplPt,a1			; BPL POINTERS DER GERADEN BITPLANES
	move.w	d0,6(a1)
	swap	d0
	move.w	d0,2(a1)

;	Zeiger auf das AGA-Bild (planes ungerade)

	move.l	#Picture2,d0
	lea	OddBplPt,a1				; BPL POINTERS DER UNGERADEN BITPLANES
	move.w	d0,6(a1)
	swap	d0
	move.w	d0,2(a1)

	bsr.w	MakeMoveTab			; Diese einfache Routine macht eine Tabelle
								; mit Werten von 0 bis 255, dann zurück zu 0

	bsr.w	FineScrollC			; Diese Routine "konvertiert" die Dezimalwerte
								; in Bildlaufwerte für die BPLCON1 AGA

	lea	$dff000,a5
	move.w	#DMASET,$96(a5)		; DMACON - aktivieren Bitplane, Copper
	move.l	#Copperlist,$80(a5)	; Zeiger Copperlist
	move.w	d0,$88(a5)			; Start Copperlist
	move.w	#0,$1fc(a5)			; Fmode zurücksetzen, burst normal
	move.w	#$c00,$106(a5)		; BPLCON3 zurücksetzen
	move.w	#$11,$10c(a5)		; BPLCON4 zurücksetzen

Mouse:
	move.l	#$1ff00,d1			; Bit zur Auswahl durch UND
	move.l	#$11000,d2			; warte auf Zeile $110
WaitY1:
	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 $110
	bne.s	WaitY1

	bsr.w	Wabble

	move.l	#$1ff00,d1			; Bit zur Auswahl durch UND
	move.l	#$11000,d2			; warte auf Zeile $110
WaitY2:
	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 $110
	beq.s	WaitY2

	btst	#6,$bfe001
	bne.s	Mouse
	rts

******************************************************************************
; Diese Routine macht eine Tabelle mit "Dezimal" -Werten 0-255-0 in zwei Tabellen
; getrennt, eines für playfield 1 und das andere für playfield 2.
******************************************************************************

NUMVAL = 255					; Der neue BPLCON1 kann von 0 bis 255 gehen,
								; lass es uns benutzen!

MakeMoveTab:
	lea	MoveTab(pc),a0			; Tab Werte playfield 1
	lea	MoveTab2(pc),a1			; Tab Werte playfield 2
	moveq	#0,d0				; minimum Playfield 1 : 0
	move.l	#NUMVAL,d2			; minimum Playfield 2 : numval
	move.l	#NUMVAL,d1			; MAXIMUM : numval
AmtLoop:
	move.w	d0,(a0)+			; Wert playfield 1
	move.w	d2,(a1)+			; Wert playfield 2
	addq.l	#1,d0				; addiere 1 zu Wert playfield 1
	subq.l	#1,d2				; subtrahiere 1 von Wert playfield 2
	cmp.l	d1,d0				; pf1=numval? (dann pf2=null)
	bne.s	AmtLoop				; Wenn noch nicht, weiter machen.
AmtLoop2:
	move.w	d0,(a0)+			; Wert Pf1 - (Ziffer auf 0)
	move.w	d2,(a1)+			; Wert Pf2 - immer bei null lassen ... still!
	subq.l	#1,d0				; Sub Wert Pf1
	bne.s	AmtLoop2			; d0=null? (flag Z) - wenn noch nicht loop!
	rts

MoveTab:
	dcb.w	NUMVAL*2,0			; *2 weil es Worte sind
MoveTabEnd:

MoveTab2:
	dcb.w	NUMVAL*2,0			; *2 weil es Worte sind
MoveTabEnd2:

******************************************************************************
; Routine, die von "Dezimalzahlen" in Werte für die BPLCON1 AGA konvertiert.
; In der Praxis wird die 8-Bit-Nummer durch Positionieren der Bits gemäß dem
; Schema der BPLCON1 aga:
;
;	15	64 PIXEL SCROLL PF2 (AGA)
;	14 	64 PIXEL SCROLL PF2 (AGA)
;	13 	ENDE SCROLL PF2 (AGA SCROLL 35ns 1/4 of pixel)
;	12 	ENDE SCROLL PF2
;	11 	64 PIXEL SCROLL PF1 (AGA)
;	10 	64 PIXEL SCROLL PF1 (AGA)
;	09 	ENDE SCROLL PF1 (AGA SCROLL 35ns 1/4 of pixel)
;	08	ENDE SCROLL PF1
;	07	PF2H3
;	06	PF2H2
;	05	PF2H1
;	04	PF2H0
;	03	PF1H3
;	02	PF1H2
;	01	PF1H1
;	00	PF1H0

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

FineScrollC:
	lea	MoveTab2(pc),a0			; Tab Wert playfield 2
	lea	MoveTab(pc),a3			; Tab Wert playfield 1
	lea	Con1Values(pc),a1		; Tab Ziel für $DFF002
	lea	MoveTabEnd2(pc),a2		; Ende der Tabelle
ConvLoop:
	moveq	#0,d1
	move.w	(a0)+,d1			; WERT "DEZIMAL" PF1 IN d1
	move.w	(a3)+,d5			; WERT "DEZIMAL" PF2 IN d5
	move.w	d1,d2				; KOPIE WERT 1 IN d2
	move.w	d1,d4				; KOPIE WERT 1 IN d4
	move.w	d5,d6				; KOPIE WERT 2 IN d6
;pf1
	and.w	#%11,d1				; Auswahl bits 0-1 (SCROLL 1/4 und 1/2 pixel)
	lsl.w	#8,d1				; Verschieben an die "richtige" Stelle: Bits 8 und 9
	move.w	d1,d3				; speichern in d3
;pf2
	and.w	#%11,d5				; Auswahl bits 0-1 (SCROLL 1/4 und 1/2 pixel)
	lsl.w	#8,d5				; Verschieben in 2 Schritten an die "richtige" Stelle:
	lsl.w	#4,d5				; insgesamt um 12 Bits verschoben: Bits 12 und 13
	or.w	d5,d3				; speichern in d3
;pf1
	and.w	#%111100,d2			; Auswählen der "alten" 4 Bits des Scrolls auf 1
								; Pixel, maximal 16 Pixel.
	lsr.w	#2,d2				; Verschieben an die richtige Stelle: die ersten 4 Bits!
	or.w	d2,d3				; speichern in d3
;pf2
	move.w	d6,d5
	and.w	#%111100,d5			; Auswählen der "alten" 4 Bits des Scrolls auf 1
								; Pixel, maximal 16 Pixel.
	lsl.w	#2,d5				; Verschieben an die richtige Stelle: 4,5,6,7 Bit
	or.w	d5,d3				; speichern in d3
;pf1
	and.w	#%11000000,d4		; hohe Bits auswählen: Aufnahmen von 16/32 Pixel
	lsl.w	#4,d4				; Richtiger Ort: BITS 10&11 für PF1
	or.w	d4,d3				; speichern in d3
;pf2
	and.w	#%11000000,d6		; hohe Bits auswählen: Aufnahmen von 16/32 Pixel
	lsl.w	#8,d6				; Richtiger Ort: BITS 14&15 für PF2
	or.w	d6,d3				; add pf2 16 pixel scroll bits to d3

	move.w	d3,(a1)+			; speichern Endwert BPLCON1
	cmp.l	a0,a2				; Ende der Tabelle?
	bne.s	ConvLoop			; Wenn noch nicht, Konvertierung fortsetzen !
	rts

; Tabelle mit Endwerten für $dff102 (BPLCON1)

Con1Values:
	dcb.w	NUMVAL*2,0
Con1ValuesEnd:

******************************************************************************
; Routine, die die Werte aus der Tabelle Con1Values Tabelle in BPLCON1 in Copper kopiert.
; Sobald Sie die gesamte Tabelle gelesen haben, stoppt sie.
******************************************************************************

Wabble:
	tst.w	FlagY				; sind wir mit der Tabelle fertig?
	beq.s	NoWa				; wenn ja, exit!
	move.l	Con1TabPointer(pc),a0	; Con1TabPointer in a0
	move.w	(a0)+,ScrlVal		; Kopie Wert in Copperlist
	cmp.l	#Con1ValuesEnd,a0		; sind wir am Ende der Tabelle?
	bne.s	Okay				; Wenn noch nicht, ok
	clr.w	FlagY				; Ansonsten bedeutet es, dass wir fertig sind
Okay:
	lea	Con1TabPointer(pc),a0	; Con1TabPointer in a0
	addq.l	#2,(a0)				; zum nächsten Wert gehen
NoWa:
	rts

FlagY:
	dc.w	-1

Con1TabPointer:
	dc.l	Con1Values

*************************************************************************
;			Copperlist AGA
*************************************************************************

	cnop	0,8

		SECTION	GRAPHIC,DATA_C

Copperlist:
	dc.w	$8e,$2c81			; DIWSTRT
	dc.w	$90,$2cc1			; DIWSTOP
	dc.w	$92,$0038			; DDFSTRT
	dc.w	$94,$00d0			; DDFSTOP

	dc.w	$102				; BPLCON1
ScrlVal:
	dc.w	0					; Wert Bplcon1 - von der Routine geändert

	dc.w	$104,0				; BPLCON2
	dc.w	$108,-8				; BPL1MOD
	dc.w	$10a,-8				; BPL2MOD

	dc.w	$1fc,3		; Burst mode 64bit - HINWEIS: Die hohen Bits von
						; BPLCON1, die das ruckartige Scrollen von 16 oder 32 Pixel 
						; ermöglichen, funktionieren nur, wenn der
						; Burst 32 bzw. 64 Bit ist.

EvenBplPt:
	dc.w	$e0,0,$e2,0			; Bitplane   0
OddBplPt:
	dc.w	$e4,0,$e6,0			; Bitplane   1

			    ; 5432109876543210
	dc.w	$100,%0010001000000001	; 2 Bitplane LOWRES 320x256.

	dc.w	$106,$C00			; Nibble hoch
	dc.w	$180,$001			; COLOR00
	dc.w	$182,$081			; COLOR01
	dc.w	$184,$aa1			; COLOR02
	dc.w	$186,$aa1			; COLOR03
	dc.w	$106,$200			; Nibble niedrig
	dc.w	$180,$124			; COLOR00
	dc.w	$182,$567			; COLOR01
	dc.w	$184,$413			; COLOR02
	dc.w	$186,$a83			; COLOR03

	dc.w	$ffff,$fffe			; Ende Copperlist

*************************************************************************
;			   BITPLANES
*************************************************************************

	cnop	0,8

Picture1:
	dcb.b	40*256,%00000111
Picture2:
	dcb.b	40*256,%01110000

	end

