*************************************************************************
* Nome: COP4.s								*
*									*
* Autore: Fabrizio Farenga						*
*									*
* Commento: Routine di esempio di uso del Copper (WAIT e MOVE)		*
*	    -Barra rossa sfumata oltre la 255 linea di schermo-		*
*									*
* Versione: 1.0								*
*									*
* Ultimo aggiornamento: 16-Jun-92 | 09:14:15				*
*									*
* Bugs: Nessuno conosciuto						*
*									*
*************************************************************************

	SECTION COP1,CODE_C	;Ordina al preprocessore di assemblare il
				;codice in CHIP RAM

;Registri dei Chip Custom utilizzati

DMACONR		EQU $DFF002
INTENAR		EQU $DFF01C
INTREQR		EQU $DFF01E
COP1LC		EQU $DFF080
COP2LC		EQU $DFF084
COPJMP1		EQU $DFF088
COPJMP2		EQU $DFF08A
DMACON		EQU $DFF096
INTENA		EQU $DFF09A

;Registri del CIA utilizzati

CIAAPRA		EQU $BFE001

START
	move.l	4,A6				;Apre la graphics.library
	moveq	#0,D0
	lea	GFX_Name,A1
	jsr	-$0228(A6)			;Exec _OpenLibrary
	move.l	d0,A5				;Preserva il puntatore alla
	move.l	$26(A5),OLDCOP			;CopperList originale

	move.w	INTENAR,OLDINTENA		;Preserva l'INTENA
	move.w	DMACONR,OLDDMACON		;Preserva il DMACON
	move.w	#%0111111111111111,DMACON	;Spegni tutti i DMA
	move.w	#%1000001010000000,DMACON	;Accendi solo il Copper DMA
	move.w	#%0111111111111111,INTENA	;Spegni tutte le IRQ
	move.l	#COP1,COP1LC			;Punta la nostra Copperlist
	move.w	#$0000,COPJMP1			;Fai ripartire il Copper

WaitMouse
	btst	#6,CIAAPRA			;Attendi che venga premuto il
	bne	WaitMouse			;tasto sinistro del Mouse

Exit
	move.l	OLDCOP,COP1LC			;Ripristina la CopperList
	bset	#15,OLDINTENA			;Attiva il bit di controllo
	bset	#15,OLDDMACON			;nell'OLDINTENA e nell'OLDDMA
	move.l	OLDINTENA,INTENA		;Ripristina l'INTENA
	move.l	OLDDMACON,DMACON		;Ripristina il DMACON

	move.l	A5,A1				;Chiude la graphics.library
	jsr	-$019E(A6)			;Exec _CloseLibrary
	rts

COP1						;Inizio della CopperList
	DC.W $0001,$FFFE	;WAIT X=$00 Y=$00
	DC.W $0180,$0000	;MOVE $0FFF,$DFF180
	DC.W $FFE1,$FFFE	;WAIT X=$E1 Y=$FF (Max X e Max Y per "entrare"
				;nella zona oltre la linea Y=$FF
	DC.W $1007,$FFFE	;WAIT X=$06 Y=$10(+$100 perche' "siamo" nella
				;zona inferiore del quadro)
	DC.W $0180,$0100	;MOVE $0100,$DFF180
	DC.W $1107,$FFFE	;WAIT X=$06 Y=$11(+$100)
	DC.W $0180,$0300	;MOVE $0300,$DFF180
	DC.W $1207,$FFFE	;E cosi' via...
	DC.W $0180,$0500
	DC.W $1307,$FFFE
	DC.W $0180,$0700	;N.B.
	DC.W $1407,$FFFE	;La X=$06 e non X=$00 perche' la posizione 0
	DC.W $0180,$0900	;non coincide con l'inizio vero e proprio
	DC.W $1507,$FFFE	;dello schermo.
	DC.W $0180,$0B00
	DC.W $1607,$FFFE
	DC.W $0180,$0D00
	DC.W $1707,$FFFE
	DC.W $0180,$0F00
	DC.W $1807,$FFFE
	DC.W $0180,$0D00
	DC.W $1907,$FFFE
	DC.W $0180,$0B00
	DC.W $1A07,$FFFE
	DC.W $0180,$0900
	DC.W $1B07,$FFFE
	DC.W $0180,$0700
	DC.W $1C07,$FFFE
	DC.W $0180,$0500
	DC.W $1D07,$FFFE
	DC.W $0180,$0300
	DC.W $1E07,$FFFE
	DC.W $0180,$0100
	DC.W $1F07,$FFFE
	DC.W $0180,$0000

	DC.W $FFFF,$FFFE	;WAIT X=$FF Y=$FF (Fine della CopperList)

GFX_Name	dc.b "graphics.library",0,0	;Nome della graphics.library

OLDINTENA	dc.w 0				;Buffer per l'INTENA
OLDDMACON	dc.w 0				;Buffer per il DMACON
OLDCOP		dc.l 0				;Buffer per la CopperList
