
		************************************
		*       /\/\                       *
		*      /    \                      *
		*     / /\/\ \ O R B_I D           *
		*    / /    \ \   / /              *
		*   / /    __\ \ / /               *
		*   ¯¯     \ \¯¯/ / I S I O N S    *
		*           \ \/ /                 *
		*            \  /                  *
		*             \/                   *
		*     Feel the DEATH inside!       *
		************************************
		* Coded by:                        *
		* The Dark Coder / Morbid Visions  *
		************************************

; Listing17b2.s = skip2.s

; Kommentare am Ende der Quelle

	SECTION	DK,CODE

	incdir	"/Sources/include/"
	include	MVstartup.s			; Startup Code: Nimmt
								; Systemprüfung vor und Aufruf
								; durch Platzieren der Start-Routine: 
								; a5=$DFF000

			;5432109876543210
DMASET	equ	%1000001010000000	; Copper DMA


Start:
	move	#DMASET,dmacon(a5)
	move.l	#Copperlist,cop1lc(a5)
	move	d0,copjmp1(a5)

	move.l	#CopperLoop,d0
	move	d0,CpPtr1+6
	swap	d0
	move	d0,CpPtr1+2

	move.l	#CopperLoop2,d0
	move	d0,CpPtr2+6
	swap	d0
	move	d0,CpPtr2+2

Mouse:

	bsr	MoveCopper

; Beachten Sie die doppelte Überprüfung der Synchronität notwendig, 
; da MoveCopper-Bewegungen auf 68030 WENIGER als EINE Rasterlinie erfordern
	move.l	#$1ff00,d1			; Bits durch UND auswählen
	move.l	#$13000,d2			; warte auf Zeile $130 (304)
.WaitY1
	move.l	vposr(a5),d0		; vposr und vhposr
	and.l	d1,d0				; wählen Sie nur die Bits der vertikalen Pos.
	cmp.l	d2,d0				; warte auf Zeile $130 (304)
	bne.s	.WaitY1

.WaitY2
	move.l	vposr(a5),d0
	and.l	d1,d0
	cmp.l	d2,d0
	beq.s	.WaitY2

	btst	#6,$bfe001			; Maus gedrückt?
	bne.s	Mouse

	rts

************************************************
* Diese Routine wiederholt die Farben in der Copperliste

MoveCopper:
	lea	CopperLoop,a0
	move.w	6(a0),d0
	moveq	#7-1,d1
.Loop
	move.w	14(a0),6(a0)
	addq.l	#8,a0
	dbra	d1,.Loop
	move.w	d0,6(a0)

	lea	CopperLoop2,a0
	move.w	6(a0),d0
	moveq	#7-1,d1
.Loop2
	move.w	14(a0),6(a0)
	addq.l	#8,a0
	dbra	d1,.Loop2
	move.w	d0,6(a0)
	rts

	SECTION	MY_COPPER,CODE_C

Copperlist:

; Bar 1
	dc.l	$01800111
	dc.l	$2907fffe
	dc.l	$01800080
	dc.l	$01800a0a
	dc.l	$2a07fffe
	dc.l	$0180011f
	dc.l	$2b07fffe
	dc.l	$01800000

	dc.w	$3007,$fffe			; warte auf Zeile $30

CpPtr1:
	dc.w	$084,0
	dc.w	$086,0

CopperLoop:						; Diese Schleife wird oberhalb der Zeile $80
	dc.w	$0007,$87fe			; ausgeführt. Alle WAITs haben das höchstwertige Bit
	dc.w	$180,$080			; der vertikalen Position bei 0
	dc.w	$0107,$87fe	 
	dc.w	$180,$0a0
	dc.w	$0207,$87fe			; WAIT in Zeile 2 mit einem signifikanten + Bit bei 0
	dc.w	$180,$0c0
	dc.w	$0307,$87fe
	dc.w	$180,$0e0
	dc.w	$0407,$87fe
	dc.w	$180,$0c0
	dc.w	$0507,$87fe
	dc.w	$180,$0a0
	dc.w	$0607,$87fe
	dc.w	$180,$080
	dc.w	$0707,$87fe
	dc.w	$180,$088
	dc.w	$00e1,$80fe
	dc.w	$8007,$ffff
	dc.w	$8a,0

CpPtr2:
	dc.w	$084,0
	dc.w	$086,0

CopperLoop2:					; Diese Schleife wird unterhalb der Zeile $80-Linie 
	dc.w	$8007,$87fe			; ausgeführt. Alle WAITs haben das höchstwertige Bit
	dc.w	$180,$080			; der vertikalen Position bei 1
	dc.w	$8107,$87fe	
	dc.w	$180,$0a0
	dc.w	$8207,$87fe			; WAIT in Zeile 2 mit einem signifikanten + Bit bei 1
	dc.w	$180,$0c0
	dc.w	$8307,$87fe
	dc.w	$180,$0e0
	dc.w	$8407,$87fe
	dc.w	$180,$0c0
	dc.w	$8507,$87fe
	dc.w	$180,$0a0
	dc.w	$8607,$87fe
	dc.w	$180,$080
	dc.w	$8707,$87fe
	dc.w	$180,$088
	dc.w	$80e1,$80fe			; hier ist der Unterschied
	dc.w	$b007,$ffff
	dc.w	$8a,0

	dc.w	$180,$000
	dc.w	$ffdf,$fffe			; warte auf Zeile 255

; Bar 2
	dc.l	$01800000
	dc.l	$1407fffe
	dc.l	$0180011f
	dc.l	$1507fffe
	dc.l	$01800a0a
	dc.l	$1607fffe
	dc.l	$01800111

	dc.w	$ffff,$fffe			; Ende der Copperlist

	end

Dieses Beispiel zeigt die Notwendigkeit, 2 Copperschleifen zu verwenden,
wegen der Unmöglichkeit, das most signifikant Bit der vertikalen Position zu
maskieren. Wir verwenden 2 Schleifen, die bis auf den Wert des höchsten Bits
von WAIT absolut identisch sind, welcher für die oben ausgeführte Schleife 0
ist und (in der anderen) ab der Zeile $80 stattdessen 1 ist. 
Die Notwendigkeit, 2 Schleifen zu verwenden, zwingt uns natürlich dazu, die
Adresse die in COP2LC enthalten ist zu variieren, d.h. jedes Mal muss die
Schleifenadresse richtig sein. Da COP2LC synchron mit dem Video geladen werden
muss, machen wir es durch den copper. Wir laden COP2LC genau im gleichen
Modus wie die anderen Zeigerregister (BPLxPT, SPRxPT usw.) durch die
copperliste. Vor dem Eintritt in eine Schleife wird die Adresse der Schleife
in COP2LC geschrieben.
Beachten Sie, da wir 2 Schleifen verwenden, muss die Prozessorroutine die 
Farben in beiden Schleifen drehen. Trotzdem stellt sich diese Technik immer 
als vorteilhaft gegenüber der Technik heraus, bei der keine Schleifen verwendet
werden. In diesem Beispiel, führen wir den Effekt von Zeile $30 bis $b0 für
insgesamt 128 Zeilen aus, was mit der "traditionellen" Technik 128 Iterationen
der Routine (zum wiederholen der Farben) erfordern würde.
Dank der Schleifen schaffen wir es mit 16 Iterationen (jeweils 8 pro
Schleife), also 8-mal schneller.
