
; Lezione7t3.s	stelle a diverse velocita`

;	In questo listato facciamo un cielo stellato
;	con stelle che hanno diverse velocita`

	SECTION	CiriCop,CODE

Inizio:
	move.l	4.w,a6		; Execbase
	jsr	-$78(a6)	; Disable
	lea	GfxName(PC),a1	; Nome lib
	jsr	-$198(a6)	; OpenLibrary
	move.l	d0,GfxBase
	move.l	d0,a6
	move.l	$26(a6),OldCop


	MOVE.L	#BITPLANE,d0
	LEA	BPLPOINTERS,A1
	move.w	d0,6(a1)
	swap	d0
	move.w	d0,2(a1)

;	Puntiamo gli sprite

	MOVE.L	#SPRITE,d0		; indirizzo dello sprite in d0
	LEA	SpritePointers,a1	; Puntatori in copperlist
	move.w	d0,6(a1)
	swap	d0
	move.w	d0,2(a1)

	move.l	#COPPERLIST,$dff080	; nostra COP
	move.w	d0,$dff088		; START COP
	move.w	#0,$dff1fc		; NO AGA!
	move.w	#$c00,$dff106		; NO AGA!

mouse:
	cmpi.b	#$ff,$dff006	; Linea 255?
	bne.s	mouse

	bsr.s	MuoviStelle	; questa routine muove le stelle

Aspetta:
	cmpi.b	#$ff,$dff006	; linea 255?
	beq.s	Aspetta

	btst	#6,$bfe001	; mouse premuto?
	bne.s	mouse

	move.l	OldCop(PC),$dff080	; Puntiamo la cop di sistema
	move.w	d0,$dff088		; facciamo partire la vecchia cop

	move.l	4.w,a6
	jsr	-$7e(a6)	; Enable
	move.l	gfxbase(PC),a1
	jsr	-$19e(a6)	; Closelibrary
	rts

;	Dati

GfxName:
	dc.b	"graphics.library",0,0

GfxBase:
	dc.l	0

OldCop:
	dc.l	0

; La routine che muove le stelle e' un poco piu' complessa in questo esempio,
; ma basta seguirla istruzione per istruzione e non e' difficile comprenderla.
; Per ogni STELLE_LOOP la routine muove 3 stelle, per la precisione 1 veloce,
; 1 lenta e 1 velocissima.

MuoviStelle:
	lea	Sprite,A0		; a0 punta allo sprite
STELLE_LOOP:

; stelle veloci (2 pixel per fotogramma)

	CMPI.B	#$f0,1(A0)		; la stella ha raggiunto il bordo
					; destro dello schermo ?
	BNE.S	no_bordo1		; no, allora salta
	MOVE.B	#$30,1(A0)		; si, rimetti la stella a sinistra
no_bordo1:
	ADDQ.B  #1,1(A0)		; sposta di 2 pixel lo sprite
	ADDQ.w	#8,A0			; prossima stella

; stelle lente (1 pixel per fotogramma)

 	CMPI.B	#$f0,1(A0)		; la stella ha raggiunto il bordo
					; destro dello schermo ?
	BNE.S	no_bordo2		; no, allora salta
	MOVE.B	#$30,1(A0)		; si, rimetti la stella a sinistra
no_bordo2:
	BCHG	#0,3(A0)
	BEQ.S	pari
	ADDQ.B  #1,1(A0)		; sposta di 2 pixel lo sprite
pari:
	ADDQ.w	#8,A0			; prossima stella

; stelle velocissime (4 pixel per fotogramma)

	CMPI.B	#$f0,1(A0)		; la stella ha raggiunto il bordo
					; destro dello schermo ?
	BNE.S	no_bordo3		; no, allora salta
	MOVE.B	#$30,1(A0)		; si, rimetti la stella a sinistra
no_bordo3:
	ADDQ.B  #2,1(A0)		; sposta di 4 pixel lo sprite
	ADDQ.w	#8,A0			; prossima stella

	CMP.L	#SpriteEnd,A0		; abbiamo raggiunto la fine?
	BLO.S	STELLE_LOOP		; se no rifai il loop
	RTS				; fine routine


	SECTION	GRAPHIC,DATA_C

COPPERLIST:
SpritePointers:
	dc.w	$120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
	dc.w	$12a,0,$12c,0,$12e,0,$130,0,$132,0
	dc.w	$134,0,$136,0,$138,0,$13a,0,$13c,0
	dc.w	$13e,0

	dc.w	$8E,$2c81	; DiwStrt
	dc.w	$90,$2cc1	; DiwStop

	dc.w	$92,$38		; DdfStart
	dc.w	$94,$d0		; DdfStop
	dc.w	$102,0		; BplCon1
	dc.w	$104,0		; BplCon2
	dc.w	$108,0		; Bpl1Mod
	dc.w	$10a,0		; Bpl2Mod

		    ; 5432109876543210
	dc.w	$100,%0001001000000000

BPLPOINTERS:
	dc.w $e0,0,$e2,0	;primo	 bitplane

	dc.w	$180,$000	; color0	; sfondo nero
	dc.w	$182,$000	; color1	; colore 1 del bitplane, che
						; in questo caso e' vuoto,
						; per cui non compare.
; lo sprite usa un solo colore, il 17

	dc.w	$1A2,$ddd	; color17, - COLOR1 dello sprite0 - bianco

	dc.w	$FFFF,$FFFE	; Fine della copperlist

;	-	-	-	-	-	-	-	

; Come potete notare, questo sprite e' riutilizzato un bel po' di volte, per
; la precisione 127. E' composto di tante coppie di word di controllo seguite
; da un $1000,$0000, ossia la linea di dati che compone ogni singola stella.
; Le posizioni verticali vanno di 2 in 2, per cui c'e' una stella ogni 2
; linee verticali, ad una posizione orizzontale diversa per ogni stella.
; il primo utilizzo dello sprite e' $307a,$3100,$1000,$0000
; il secondo e' $3220,$3300,$1000,$0000
; E cosi' via. I vari VSTART vanno di 2 in 2, infatti sono $30,$32,$34,$36...
; Gli HSTART sono posizionati casualmente ($7a,$20,$c0,$50...)
; I Vstop sono chiaramente 1 linea dopo lo start ($31,$33,$35..) essendo le
; stelle alte 1 pixel.
; La routine agisce ogni fotogramma su tutti gli HSTART spostando avanti le
; stelle.

Sprite:
	dc.w    $307A,$3100,$1000,$0000,$3220,$3300,$1000,$0000
	dc.w    $34C0,$3500,$1000,$0000,$3650,$3700,$1000,$0000
	dc.w    $3842,$3900,$1000,$0000,$3A6D,$3B00,$1000,$0000
	dc.w    $3CA2,$3D00,$1000,$0000,$3E9C,$3F00,$1000,$0000
	dc.w    $40DA,$4100,$1000,$0000,$4243,$4300,$1000,$0000
	dc.w    $445A,$4500,$1000,$0000,$4615,$4700,$1000,$0000
	dc.w    $4845,$4900,$1000,$0000,$4A68,$4B00,$1000,$0000
	dc.w    $4CB8,$4D00,$1000,$0000,$4EB4,$4F00,$1000,$0000
	dc.w    $5082,$5100,$1000,$0000,$5292,$5300,$1000,$0000
	dc.w    $54D0,$5500,$1000,$0000,$56D3,$5700,$1000,$0000
	dc.w    $58F0,$5900,$1000,$0000,$5A6A,$5B00,$1000,$0000
	dc.w    $5CA5,$5D00,$1000,$0000,$5E46,$5F00,$1000,$0000
	dc.w    $606A,$6100,$1000,$0000,$62A0,$6300,$1000,$0000
	dc.w    $64D7,$6500,$1000,$0000,$667C,$6700,$1000,$0000
	dc.w    $68C4,$6900,$1000,$0000,$6AC0,$6B00,$1000,$0000
	dc.w    $6C4A,$6D00,$1000,$0000,$6EDA,$6F00,$1000,$0000
	dc.w    $70D7,$7100,$1000,$0000,$7243,$7300,$1000,$0000
	dc.w    $74A2,$7500,$1000,$0000,$7699,$7700,$1000,$0000
	dc.w    $7872,$7900,$1000,$0000,$7A77,$7B00,$1000,$0000
	dc.w    $7CC2,$7D00,$1000,$0000,$7E56,$7F00,$1000,$0000
	dc.w    $805A,$8100,$1000,$0000,$82CC,$8300,$1000,$0000
	dc.w    $848F,$8500,$1000,$0000,$8688,$8700,$1000,$0000
	dc.w    $88B9,$8900,$1000,$0000,$8AAF,$8B00,$1000,$0000
	dc.w    $8C48,$8D00,$1000,$0000,$8E68,$8F00,$1000,$0000
	dc.w    $90DF,$9100,$1000,$0000,$924F,$9300,$1000,$0000
	dc.w    $9424,$9500,$1000,$0000,$96D7,$9700,$1000,$0000
	dc.w    $9859,$9900,$1000,$0000,$9A4F,$9B00,$1000,$0000
	dc.w    $9C4A,$9D00,$1000,$0000,$9E5C,$9F00,$1000,$0000
	dc.w    $A046,$A100,$1000,$0000,$A2A6,$A300,$1000,$0000
	dc.w    $A423,$A500,$1000,$0000,$A6FA,$A700,$1000,$0000
	dc.w    $A86C,$A900,$1000,$0000,$AA44,$AB00,$1000,$0000
	dc.w    $AC88,$AD00,$1000,$0000,$AE9A,$AF00,$1000,$0000
	dc.w    $B06C,$B100,$1000,$0000,$B2D4,$B300,$1000,$0000
	dc.w    $B42A,$B500,$1000,$0000,$B636,$B700,$1000,$0000
	dc.w    $B875,$B900,$1000,$0000,$BA89,$BB00,$1000,$0000
	dc.w    $BC45,$BD00,$1000,$0000,$BE24,$BF00,$1000,$0000
	dc.w    $C0A3,$C100,$1000,$0000,$C29D,$C300,$1000,$0000		
	dc.w    $C43F,$C500,$1000,$0000,$C634,$C700,$1000,$0000		
	dc.w    $C87C,$C900,$1000,$0000,$CA1D,$CB00,$1000,$0000		
	dc.w    $CC6B,$CD00,$1000,$0000,$CEAC,$CF00,$1000,$0000
	dc.w    $D0CF,$D100,$1000,$0000,$D2FF,$D300,$1000,$0000		
	dc.w    $D4A5,$D500,$1000,$0000,$D6D6,$D700,$1000,$0000		
	dc.w    $D8EF,$D900,$1000,$0000,$DAE1,$DB00,$1000,$0000		
	dc.w    $DCD9,$DD00,$1000,$0000,$DEA6,$DF00,$1000,$0000		
	dc.w    $E055,$E100,$1000,$0000,$E237,$E300,$1000,$0000		
	dc.w    $E47D,$E500,$1000,$0000,$E62E,$E700,$1000,$0000
	dc.w    $E8AF,$E900,$1000,$0000,$EA46,$EB00,$1000,$0000
	dc.w	$EC65,$ED00,$1000,$0000,$EE87,$EF00,$1000,$0000
	dc.w	$F0D4,$F100,$1000,$0000,$F2F5,$F300,$1000,$0000
	dc.w	$F4FA,$F500,$1000,$0000,$F62C,$F700,$1000,$0000
	dc.w	$F84D,$F900,$1000,$0000,$FAAC,$FB00,$1000,$0000
	dc.w	$FCB2,$FD00,$1000,$0000,$FE9A,$FF00,$1000,$0000
	dc.w	$009A,$0106,$1000,$0000,$02DF,$0306,$1000,$0000
	dc.w	$0446,$0506,$1000,$0000,$0688,$0706,$1000,$0000
	dc.w	$0899,$0906,$1000,$0000,$0ADD,$0B06,$1000,$0000
	dc.w	$0CEE,$0D06,$1000,$0000,$0EFF,$0F06,$1000,$0000
	dc.w	$10CD,$1106,$1000,$0000,$1267,$1306,$1000,$0000
	dc.w	$1443,$1506,$1000,$0000,$1664,$1706,$1000,$0000
	dc.w	$1823,$1906,$1000,$0000,$1A6D,$1B06,$1000,$0000
	dc.w	$1C4F,$1D06,$1000,$0000,$1E5F,$1F06,$1000,$0000
	dc.w	$2055,$2106,$1000,$0000,$2267,$2306,$1000,$0000
	dc.w	$2445,$2506,$1000,$0000,$2623,$2706,$1000,$0000
	dc.w	$2834,$2906,$1000,$0000,$2AF0,$2B06,$1000,$0000
SpriteEnd:
	dc.w 	$0000,$0000	; Fine dello sprite


	SECTION	PLANEVUOTO,BSS_C
BITPLANE:
	ds.b	40*256

	end

In questo listato facciamo muovere le stelle a velocita` diversa, in modo da
creare un effetto migliore. Diamo alle stelle tre velocita` diverse.
La routine MuoviStelle sposta tre stelle per ogni ciclo. La prima stella viene
spostata di 2 pixel come abbiamo visto nel primo esempio, la seconda stella
di 1 solo pixel, mentre la terza viene spostata di 4 pixel, aggiungendo
2 al byte HSTART. La routine controlla se abbiamo raggiunto l'ultima stella
solo dopo averne spostate 3.
