*************************************************************************
* Nome: SPRITE1.s							*
*									*
* Autore: Fabrizio Farenga						*
*									*
* Commento: Sprite fisso su uno sfondo nero				*
*									*
* Versione: 1.0								*
*									*
* Ultimo aggiornamento: 08-Jan-93 | 12:25				*
*									*
* Bugs: Nessuno conosciuto						*
*									*
*************************************************************************

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

;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.
	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
	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

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

SPRITE1				;Struttura sprite
	DC.W $9488,$A400	;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: Sprite1.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
