
; Listing11h5e.s	- dieses Listing ist nicht im Original Kurs enthalten
; (das e steht für extra)
; Anwendung des Copper skip, (skip - überspringe die nächste Move-Anweisung)	
; mit der rechten Maustaste wird mit COPJMP2 ($dff08a) zur 
; Copperlist2 gesprungen
				
	SECTION	COPPERADVANCED,CODE

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

*****************************************************************************
	include	"/Sources/startup2.s" ; speichern Sie Interrupt, DMA und so weiter.
*****************************************************************************

			;5432109876543210
DMASET	equ	%1000001110000000	; nur Copper und Bitplane DMA

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

Start:
	lea	$dff000,a5
	move.w	#DMASET,$96(a5)		; DMACON - aktivieren Bitplane, Copper
	move.l	#Cop2,$84(a5)		; Zeiger Copperlist2
	move.l	#Cop1,$80(a5)		; Zeiger Copperlist1
	move.w	d0,$88(a5)			; Start Copperlist1
	move.w	#0,$1fc(a5)			; AGA "deaktivieren"
	move.w	#$c00,$106(a5)		; AGA "deaktivieren"
	move.w	#$11,$10c(a5)		; AGA "deaktivieren"

Mouse:	
	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		

	btst	#2,$16(a5)			; rechte Maustaste gedrückt?
	beq.s	NotSwap				; dann nicht tauschen 
			
	move.w	#$ff01,Skip			; skip, wenn RMT gedrückt wird
	bra Mouse2		

NotSwap:
	move.w	#$fffe,Skip			; wait, wenn RMT nicht gedrückt

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

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

	SECTION	GRAPHIC,DATA_C

Cop1:							; Copperlist 1
SpritePointers:
	dc.w	$120,0,$122,0,$124,0,$126,0,$128,0 ; Sprite
	dc.w	$12a,0,$12c,0,$12e,0,$130,0,$132,0
	dc.w	$134,0,$136,0,$138,0,$13a,0,$13c,0
	dc.w	$13e,0

	dc.w	$8e,$2c81			; DIWSTRT
	dc.w	$90,$2cc1			; DIWSTOP
	dc.w	$92,$0038			; DDFSTRT
	dc.w	$94,$00d0			; DDFSTOP
	dc.w	$102,0				; BPLCON1
	dc.w	$104,0				; BPLCON2
	dc.w	$108,0				; BPL1MOD
	dc.w	$10a,0				; BPL2MOD
				; 5432109876543210
	;dc.w	$100,%0001001000000000	; 1 Bitplane LOWRES 320x256
	dc.w	$100,%0000001000000000	; $0200 keine Bitplane

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

	dc.w	$1007,$fffe			
	dc.w	$180,$f00			; rot		
	dc.w	$4001,$fffe			; ohne diese Warteanweisung
								; wird der COPJMP2 immer ausgeführt werden
	dc.w	$4007		
Skip:
	dc.w	$ff01				; skip	$ff01 or wait $fffe
	dc.w	$8a,0				; copjmp2 start
		
	dc.w	$180,$0f0			; grün					
	dc.w	$6007,$fffe	
	dc.w	$180,$00f			; blau
	dc.w	$ffff,$fffe

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

Cop2:							; Copperlist 2
	dc.w	$8007,$fffe	 
	dc.w	$180,$000			; schwarz
	dc.w	$a007,$fffe	 
	dc.w	$180,$fff			; weiss
	dc.w	$c007,$fffe	 
	dc.w	$180,$ff0			; gelb	
	dc.w	$ffff,$fffe

	end


der einzige Unterschied zwischen wait und skip ist:
SECOND WAIT INSTRUCTION WORD (IR2)
Bit 0 Always set to 0		- das Ende ist immer gerade		

SECOND SKIP INSTRUCTION WORD (IR2)
Bit 1 Always set to 1		- das Ende ist immer ungerade	

Will man an der Position $4007 zur Copperlist2 springen, so muss der
Videostrahl zum Zeitpunkt des skip-Befehls diese Position erreicht haben.
In der Copperlist1 wird dies durch das dc.w	$4007,$fffe	erreicht.

Ohne diese Warteanweisung wäre der Videostrahl irgendwo kurz nach $1007,
wenn er auf die Sprunganweisung trifft, sodass der folgende MOVE (CJMP)
immer ausgeführt wird! 
	
teste auch:
dc.w	$4007,$fffe				; dc.w	$39e1,$fffe, dc.w $4001,$fffe		
								; der Copper benötigt einige Zeit um den 
								; eigenen wait-Befehl auszuführen   