*************************************************************************
* Nome: SPRITE2.s							*
*									*
* Autore: Fabrizio Farenga						*
*									*
* Commento: Sprite rimbalzante per lo schermo su uno sfondo nero	*
*									*
* Versione: 1.0								*
*									*
* Ultimo aggiornamento: 08-Jan-93 | 12:24				*
*									*
* Bugs: Nessuno conosciuto						*
*									*
*************************************************************************

		SECTION SPRITE1,CODE_C	;Ordina all'assemblatore di allocare
					;tutto nella memoria Chip.

SPEEDX		EQU 2		;Velocita' di movimento lungo l'asse delle X.
SPEEDY		EQU 2		;Velocita' di movimento lungo l'asse delle Y.
HEIGHT		EQU 16		;Altezza (in pixels) dello sprite.


;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.
	jsr	InitSprites			;inizializza i puntatori.
	move.w	#%1000001110100000,DMACON	;Accendi solo il Copper DMA
						;e quello degli Sprites.
	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
	beq	Exit				;tasto sinistro del Mouse.

	cmp.b	#$ff,VHPOSR			;Attendi che il pennello
	bne	WaitMouse			;elettronico sia alla posizione
						;$FF.
	jsr	SetCoords			;Copia le coordinate nella
						;struttura sprite.
	jsr	DoBump				;Calcola le coordinate del
						;rimbalzo.

	cmp.b	#$0,VHPOSR			;Attendi (per sicurezza) che il
	bne	WaitMouse			;pennello elettronico non sia
						;ancora sulla linea precedente.
	bra	WaitMouse			;Ritorna al controllo 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

InitSprites
	lea	SpriteCopper,a0		;Prende l'indirizzo dei puntatori agli
					;sprites.
	move.l	#SPRITE1,d0		;Prende l'indirizzo dello Sprite1.
	move.w	d0,6(a0)		;Immette la word bassa.
	swap	d0			;Scambia le due word dell'indirizzo.
	move.w	d0,2(a0)		;Immette la word alta.

	add.w	#8,a0			;Fa avanzare il puntatore agli sprites.

	move.l	#SPRITENULL,d0		;Prende l'indirizzo dello Sprite vuoto.
	move.w	d0,6(a0)		;Immette la word bassa.
	swap	d0			;Scambia le due word dell'indirizzo.
	move.w	d0,2(a0)			;Immette la word alta.

	add.w	#8,a0			;Fa avanzare il puntatore agli sprites.

	move.l	#SPRITENULL,d0		;Prende l'indirizzo dello Sprite vuoto.
	move.w	d0,6(a0)		;Immette la word bassa.
	swap	d0			;Scambia le due word dell'indirizzo.
	move.w	d0,2(a0)		;Immette la word alta.

	add.w	#8,a0			;Fa avanzare il puntatore agli sprites.

	move.l	#SPRITENULL,d0		;Prende l'indirizzo dello Sprite vuoto.
	move.w	d0,6(a0)		;Immette la word bassa.
	swap	d0			;Scambia le due word dell'indirizzo.
	move.w	d0,2(a0)				;Immette la word alta.

	add.w	#8,a0			;Fa avanzare il puntatore agli sprites.

	move.l	#SPRITENULL,d0		;Prende l'indirizzo dello Sprite vuoto.
	move.w	d0,6(a0)		;Immette la word bassa.
	swap	d0			;Scambia le due word dell'indirizzo.
	move.w	d0,2(a0)		;Immette la word alta.

	add.w	#8,a0			;Fa avanzare il puntatore agli sprites.

	move.l	#SPRITENULL,d0		;Prende l'indirizzo dello Sprite vuoto.
	move.w	d0,6(a0)		;Immette la word bassa.
	swap	d0			;Scambia le due word dell'indirizzo.
	move.w	d0,2(a0)		;Immette la word alta.

	add.w	#8,a0			;Fa avanzare il puntatore agli sprites.

	move.l	#SPRITENULL,d0		;Prende l'indirizzo dello Sprite vuoto.
	move.w	d0,6(a0)		;Immette la word bassa.
	swap	d0			;Scambia le due word dell'indirizzo.
	move.w	d0,2(a0)		;Immette la word alta.

	add.w	#8,a0			;Fa avanzare il puntatore agli sprites.

	move.l	#SPRITENULL,d0		;Prende l'indirizzo dello Sprite vuoto.
	move.w	d0,6(a0)		;Immette la word bassa.
	swap	d0			;Scambia le due word dell'indirizzo.
	move.w	d0,2(a0)		;Immette la word alta.

	rts

DoBump					;Calcola le coordinate del rimbalzo
LoopX
	move.w	XPos,d0
	add.w	XSpeed,d0
	bmi	ChangeDirX
	cmp.w	#$90,d0
	ble	NoChangeDirX
ChangeDirX
	neg.w	XSpeed
	bra	LoopX
NoChangeDirX
	move.w	d0,XPos

LoopY
	move.w	YPos,d0
	add.w	YSpeed,d0
	bmi	ChangeDirY
	cmp.w	#$C3,d0
	ble	NoChangeDirY
ChangeDirY
	neg.w	YSpeed
	bra	LoopY
NoChangeDirY
	move.w	d0,YPos

	rts

SetCoords			;Copia le coordinate dalle variabili nella
				;struttura sprite.
	lea	SPRITE1,a0
	move.w	XPos,d0		;Prende la X.
	add.b	#70,d0		;Ci somma l'OffSet del video.
	move.b	d0,1(a0)	;Lo immette in HSTART della struttura sprite.

	move.w	YPos,d0		;Prende la Y.
	add.b	#44,d0		;Ci somma l'OffSet del video.
	move.b	d0,(a0)		;Lo immette in VSTART della struttura sprite.
	add.b	#HEIGHT,d0	;Ci somma l'altezza.
	move.b	d0,2(a0)	;La immette in VSTOP della struttura sprite.
	rts


XPos	dc.w 0
YPos	dc.w 0

XSpeed	dc.w SPEEDX
YSpeed	dc.w SPEEDY

SPRITE1				;Struttura sprite
	DC.W $64C8,$7400	;Word di controllo
	DC.W $003F,$FFC0	;Dati
	DC.W $007F,$FF80
	DC.W $00FF,$FF00
	DC.W $01FF,$FE00
	DC.W $03FF,$FC00
	DC.W $07FF,$F800
	DC.W $0FFF,$F001
	DC.W $1FFF,$E003
	DC.W $3FFF,$C007
	DC.W $7FFF,$800F
	DC.W $FFFF,$001F
	DC.W $FFFF,$003F
	DC.W $FFFF,$007F
	DC.W $FFFF,$00FF
	DC.W $FFFF,$01FF
	DC.W $FFFF,$03FF
	DC.W $0000,$0000	;Terminatori


SPRITENULL			;Sprite vuoto
	DC.W 0,0		;Word di controllo (azzerate)


COP1						;Inizio della CopperList.
	DC.W $0180,$0000,$0182,$0000		;Colore di fondo e #1 neri
	DC.W $00E0,$0000,$00E2,$0000		;I puntatori ai bitplane
						;possono essere indirizzati
						;a qualunque locazione visto
						;che l'immagine non sara'
						;visualizzata (colore Nero).
	DC.W $0100,$1200			;Attiva un bitplane.

	DC.W $01A2,$0fff,$01A4,$00f0,$01A6,$0f00;Setta i colori dello sprite.

SpriteCopper:					;Puntatori agli sprite.
	DC.W $0120,$0000,$0122,$0000
	DC.W $0124,$0000,$0126,$0000
	DC.W $0128,$0000,$012A,$0000
	DC.W $012C,$0000,$012E,$0000
	DC.W $0130,$0000,$0132,$0000
	DC.W $0134,$0000,$0136,$0000
	DC.W $0138,$0000,$013A,$0000
	DC.W $013C,$0000,$013E,$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

VERSION		dc.b "$VER: Sprite2.EXE_1.0 (08-Jan-93) By Fabrizio Farenga",0

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