*************************************************************************
* Nome: SPRITE2B.s							*
*									*
* Autore: Fabrizio Farenga						*
*									*
* Commento: Gestione del rimbalzo di uno sprite a 16 colori.		*
*									*
* Versione: 1.0								*
*									*
* Ultimo aggiornamento: 01-Feb-92 | 16:06				*
*									*
* Bugs: Nessuno conosciuto						*
*									*
*************************************************************************

		SECTION SPRITE2B,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
CLXDAT		EQU $DFF00E
INTENAR		EQU $DFF01C
INTREQR		EQU $DFF01E
COP1LC		EQU $DFF080
COP2LC		EQU $DFF084
COPJMP1		EQU $DFF088
COPJMP2		EQU $DFF08A
DMACON		EQU $DFF096
INTENA		EQU $DFF09A
COLOR00		EQU $DFF180
COLOR02		EQU $DFF182
;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.
	jsr	CheckColl			;Controlla che avvenga una
						;Collisione

	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	#SPRITE2,d0		;Prende l'indirizzo dello Sprite2.
	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	#SPRITE3,d0		;Prende l'indirizzo dello Sprite3.
	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 nelle
				;struttura Sprite.
	lea	SPRITE1,a0
	lea	SPRITE2,a1
	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 Sprite1.
	move.b	d0,1(a1)	;Lo immette in HSTART della struttura Sprite2.

	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 sprite1.
	move.b	d0,(a1)		;Lo immette in VSTART della struttura sprite2.
	add.b	#HEIGHT,d0	;Ci somma l'altezza.
	move.b	d0,2(a0)	;La immette in VSTOP della struttura sprite1.
	move.b	d0,2(a1)	;La immette in VSTOP della struttura sprite2.
	rts

CheckColl:			;Controlla che avvenga una collisione.
	move.w	CLXDAT,d0
	and.w	#%0000001000000000,d0
	beq	NoCollided
	move.w	#$FFF,COLOR00
	move.w	#$FFF,COLOR02
NoCollided
	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 $CCCC,$3C3C,$9998,$7878,$3332,$F0F0,$6666,$E1E0 ;Dati
	DC.W $CCCC,$C3C2,$9998,$8786,$3332,$0F0E,$6666,$1E1E
	DC.W $CCCC,$3C3C,$9998,$7878,$3332,$F0F0,$6666,$E1E0
	DC.W $CCCC,$C3C2,$9998,$8786,$3332,$0F0E,$6666,$1E1E
	DC.W $0000,$0000	;Terminatori

SPRITE2				;Struttura sprite
	DC.W $64C8,$7480	;Word di controllo
	DC.W $03FC,$0002,$07F8,$0006,$0FF0,$000E,$1FE0,$001E ;Dati
	DC.W $3FC0,$003E,$7F80,$007E,$FF00,$00FE,$FE00,$01FE
	DC.W $FC02,$03FE,$f806,$07FE,$F00E,$0FFE,$E01E,$1FFE
	DC.W $C03E,$3FFE,$807E,$7FFE,$00FE,$FFFE,$01FE,$FFFE
	DC.W $0000,$0000	;Terminatori

SPRITE3
	DC.W $7080,$A000
	dc.w $ffff,$0000,$ffff,$0000,$ffff,$0000,$ffff,$0000
	dc.w $ffff,$0000,$ffff,$0000,$ffff,$0000,$ffff,$0000
	dc.w $ffff,$0000,$ffff,$0000,$ffff,$0000,$ffff,$0000
	dc.w $ffff,$0000,$ffff,$0000,$ffff,$0000,$ffff,$0000
	dc.w $0000,$ffff,$0000,$ffff,$0000,$ffff,$0000,$ffff
	dc.w $0000,$ffff,$0000,$ffff,$0000,$ffff,$0000,$ffff
	dc.w $0000,$ffff,$0000,$ffff,$0000,$ffff,$0000,$ffff
	dc.w $0000,$ffff,$0000,$ffff,$0000,$ffff,$0000,$ffff
	dc.w $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff
	dc.w $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff
	dc.w $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff
	dc.w $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff
	DC.W $0000,$0000



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	$01A0,$0000,$01A2,$0090,$01A4,$01a1,$01A6,$03b3	;Setta i colori degli
 dc.w	$01A8,$05b5,$01Aa,$07c7,$01Ac,$09d9,$01Ae,$0cec	;sprites.
 dc.w	$01B0,$0fff,$01B2,$0ecc,$01B4,$0d99,$01B6,$0c77
 dc.w	$01B8,$0b55,$01Ba,$0a33,$01Bc,$0911,$01Be,$0800

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: Sprite2B.EXE_1.0 (01-Feb-93) By Fabrizio Farenga",0

		CNOP 0,2

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