*************************************************************************
* Nome: COP3.s								*
*									*
* Autore: Fabrizio Farenga						*
*									*
* Commento: Routine di esempio d'uso del Copper (WAIT, MOVE e SKIP)	*
*	    -Uso dello SKIP per ripetere gli stessi comandi 6 volte-	*
*									*
* Versione: 1.0								*
*									*
* Ultimo aggiornamento: 16-Jun-92 | 09:13:32				*
*									*
* 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
VHPOSR		EQU $DFF006
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.l	$36(A5),OLDCOP2			;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.l	#COPLOOP,COP2LC			;Punta il loop nella 2nda
						;Copperlist
	move.w	#$0000,COPJMP1			;Fai ripartire il Copper

WaitMouse
	cmp.b	#0,VHPOSR			;Attendi che il Beam sia nella
	bne	WaitMouse			;posizione Y=$00

	jsr	Flash				;Esegui la routine dei Flash
	
	btst	#6,CIAAPRA			;Attendi che venga premuto il
	bne	WaitMouse			;tasto sinistro del Mouse

Exit
	move.l	OLDCOP,COP1LC			;Ripristina la CopperList
	move.l	OLDCOP2,COP2LC			;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 $0000,$DFF180

	DC.W $9047,$FFFE	;WAIT X=$46 Y=$90
COPLOOP				;Punto in cui si ritora durante il loop
	DC.W $0180,$0000	;MOVE $0000,$DFF180 (il $0000 verra' cambiato
				;dalla routine Flash)
	DC.W $0180,$000F	;Metti il colore blu

	DC.W $90BB,$FFFF	;SKIP X=$BA Y=$90 (Salta la prossima istruzione
				;se e' stata raggiunta la coordinata indicata)
	DC.W $008A,$0000	;GOTO COPLOOP

	DC.W $0180,$000F	;MOVE $000F,$DFF180
	DC.W $0180,$0000	;MOVE $0000,$DFF180
	DC.W $FFFF,$FFFE	;WAIT X=$FF Y=$FF (Fine della CopperList)

Flash					;Routine di Flash
	sub.b	#1,Slower		;Aspetta 5 cicli video ogni Flash
	bne	NoFlash
	move.b	#5,Slower

	lea	FlashTab,a0		;Punta la tabella.
	move.w	FlashCounter,d0		;Leggi il contatore della tabella.
	cmp.w	#$FFFF,(a0,d0)		;Controlla che non si sia arrivati
	bne	NoResetFlash		;alla fine della tabella.
	move.w	#0,FlashCounter		;Nel qual caso ritorna all'inizio
	move.w	#0,d0			;della tabella.
NoResetFlash				;Copia il colore dalla tabella nel
	move.w	(a0,d0),COPLOOP+2	;colore corretto nella CopperList.
	add.w	#2,FlashCounter		;Incrementa il contatore.
NoFlash
	rts


FlashTab				;Tabella dei colori da immettere
					;nella CopperList
	dc.w $0000,$0010,$0020,$0030,$0040,$0050,$0060,$0070
	dc.w $0080,$0090,$00A0,$00B0,$00C0,$00D0,$00E0,$00F0
	dc.w $00E0,$00D0,$00C0,$00B0,$00A0,$0090,$0080
	dc.w $0070,$0060,$0050,$0040,$0030,$0020,$0010
	dc.w $FFFF
FlashCounter				;Contatore dei colori da immettere
	dc.w 0				;nella CopperList
Slower					;Conta i quadri video in cui non
	dc.b 5				;bisogna effettuare il Flash
	CNOP 0,2			;Allinea il codice a Word
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
OLDCOP2		dc.l 0				;Buffer per la CopperList
