*************************************************************************
* Nome: COP2.s								*
*									*
* Autore: Fabrizio Farenga						*
*									*
* Commento: Routine di esempio di uso del Copper (WAIT e MOVE)		*
*	    -Test di mascheramento del WAIT-				*
*									*
* Versione: 1.0								*
*									*
* Ultimo aggiornamento: 16-Jun-92 | 09:09:35				*
*									*
* 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.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
	cmp.b	#0,VHPOSR			;Attendi che il Beam sia nella
	bne	WaitMouse			;posizione Y=$00

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

	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

Bounce:						;Routine per il rimbalzo
	tst.w	SlowMo				;Il rallentatore e' a 0 ?
	beq	DoBounce			;Se si, muovi la Y
	sub.w	#1,SlowMo			;Altrimenti togli uno al
	rts					;rallentatore
DoBounce
	move.w	#1,SlowMo			;Ricarica il rallentatore
	lea	YTab,A0				;Controlla se si e' giunti
	move.w	YCounter,D0			;alla fine della tabella...
	cmp.b	#$FF,(A0,D0)
	bne	NoResetYCounter
	move.w	#0,YCounter			;nel qual caso ricomincia 
	moveq	#0,D0				;da capo
NoResetYCounter
	move.b	(A0,D0),CoordY			;Copia il valore dalla tabella
	add.w	#1,YCounter			;alla coordinata Y e incrementa
	rts					;il contatore


COP1						;Inizio della CopperList
	DC.W $0001,$FFFE	;WAIT X=$00 Y=$00
	DC.W $0180,$0000	;MOVE $0000,$DFF180 (Colore $0000 nel fondo)

CoordY				;Il primo byte presente dopo questa etichetta,
				;rappresenta la coordinata Y che governa tutte
				;le altre. Questo per il semplice fatto che
				;quelle seguenti attendono semplicemente una
				;linea oltre!
	DC.W $28E1,$FFFE	;WAIT X=$E0 Y=$28 (modificando questa Y, si
				;spostano automaticamente tutte le altre)
	DC.W $0007,$80FE	;WAIT X=$06 Y=?? (Attende l'inizio della linea)
	DC.W $0180,$0101	;MOVE $0101,$DFF180 (Colore $0101 nel fondo)
	DC.W $00E1,$80FE	;WAIT X=$E0 Y=$?? (Aspetta prossima linea)
	DC.W $0007,$80FE	;WAIT X=$06 Y=?? (Attende l'inizio della linea)
	DC.W $0180,$0303	;E cosi' via...
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0505
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0707	;N.B. l'inizio dello schermo corrisponde
	DC.W $00E1,$80FE	;a X=$06 e non X=$00
	DC.W $0007,$80FE
	DC.W $0180,$0909
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0B0B
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0D0D
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0F0F
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0D0D
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0B0B
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0909
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0707
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0505
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0303
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0101
	DC.W $00E1,$80FE
	DC.W $0007,$80FE
	DC.W $0180,$0000

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

YTab				;Tabella dei valori da assegnare alla Y
	dc.b 40,40,41,41,41,42,42,43,43,44,45,46,47,48,49,50,51,52,53,54
	dc.b 55,55,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74
	dc.b 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94
	dc.b 95,96,96,97,97,98,98,99,99,99,98,98,97,97,96,96,95,94,93,92
	dc.b 91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72
	dc.b 71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52
	dc.b 51,50,49,48,47,46,45,44,43,43,42,42,41,41,41,40,40
	dc.b $FF
	CNOP 0,2		;Riallinea il codice a indirizzi pari
YCounter			;Contatore del valore della tabella Y raggiunto
	dc.w 0
SlowMo				;Contatore per i quadri video in cui non 
	dc.w 0			;cambiare la coordinata Y


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

