;APRES ASSEMBLAGE
;POUR CHARGER LES DATAS TAPEZ:
;
;RI		RETURN
;BOULES_RAW	RETURN
;BOULES		RETURN
;
;PUIS TAPEZ
;G BEGIN	RETURN RETURN
;
;SUPPRIMEZ LES LIGNES SUIVANTES SI VOTRE VERSION DU SEKA
;NE COMPORTE PAS LA COMMANDE Y

>EXTERN "BOULES_RAW",BOULES

org $30000	;EMPLACEMENT EN MEMOIRE
load $30000	;DE NOTRE PROGRAMME

BEGIN:
JMP START
;=====================================================================
EXECBASE=4
OPENLIBRARY=-408
CLOSELIBRARY=-414
SUPERSTATE=-150
USERSTATE=-156	
FORBID=-132
PERMIT=-138
ADDINTSERVER=-168
REMINTSERVER=-174
Open=-30
Close=-36
Read=-42
;=====================
STARSNBR        = 40	;NOMBRE DE BOULES
STARSSPEED      = 2	;VITESSE DES BOULES
;=====================================================================
BLTCON0=$DFF040		
BLTCON1=$DFF042
BLTAFWM=$DFF044
BLTALWM=$DFF046
BLTCPTH=$DFF048
BLTCPTL=$DFF04A
BLTBPTH=$DFF04C
BLTBPTL=$DFF04E
BLTAPTH=$DFF050
BLTAPTL=$DFF052
BLTDPTH=$DFF054
BLTDPTL=$DFF056
BLTSIZE=$DFF058
BLTCMOD=$DFF060
BLTBMOD=$DFF062
BLTAMOD=$DFF064
BLTDMOD=$DFF066
BLTCDAT=$DFF070
BLTBDAT=$DFF072
BLTADAT=$DFF074
DMACONR=$DFF002
;==================================
BOULES=$40000			;IMAGE DES BOULES
				;320 SUR 18 EN 2 PLANS
ECRAN=$50000			;ECRAN DOUBLE
				;368 SUR 150 EN 2 PLANS   2 FOIS
COORDS=ECRAN+[46*150*4]		;EMPLACEMENT DES COORDONNEES
				
;==================================
START:    
MOVEM.L D0-D7/A0-A6,-(A7)	;SAUVE REGISTRES
MOVE.L EXECBASE,A6		;CHARGE ADRESSE EXECBASE DANS A6
JSR FORBID(A6)    		;SAUTE SOUS PROGRAMME: INTERDIT MULTITACHE
JSR OPENLIB  			;SAUTE SOUS PROGRAMME: OUVERTURE LIBRAIRIES

LEA ECRAN,A0			;EFFACEMENT EMPLACEMENT ECRANS
MOVE.W #[46*150*2]-1,D0
EFFACE:
MOVE.W #0,(A0)+
DBF D0,EFFACE

BSR.L	STARSINIT		;INITIALISATION DES DES COORDONNES DES BOULES

BSR.L SETCOPPER			;SAUTE SOUS PROGRAMME: MET EN PLACE LISTE COPPER
BSR.s NEWIRQ3			;SAUTE SOUS PROGRAMME: MET EN PLACE ROUTINE D'INTERRRUPTION

WAIT:
CMP.B #$20,$DFF006		;ATTENDANT 200 IEME LIGNE RASTER
BNE.S WAIT			;SINON RETOURNE A WAIT

BSR.L	STARS			;VA ROUTINE D'AFFICHAGE DES BOULES

BTST	#6,$BFE001		;ATTENDANT PRESSION SUR BOUTON GAUCHE SOURIS
BNE.S	WAIT			;SINON RETOURNE A WAIT
 				;SI OUI  FIN
END: 				;FIN:	
BSR.s STOPIRQ3        		;SAUTE SOUS PROGRAMME: STOPPE INTERRUPTION
BSR.L CLRCOPPER       		;SAUTE SOUS PROGRAMME: RESTAURE ANCIENNE LISTE COPPER
BSR.L CLOSELIB        		;SAUTE SOUS PROGRAMME: FERME LIBRAIRIES 
MOVE.L EXECBASE,A6		;CHARGE ADRESSE EXECBASE DANS A6
JSR PERMIT(A6)      		;AUTORISE MULTITACHE
                      
MOVEM.L (A7)+,D0-D7/A0-A6	;RESTAURE REGISTRES
RTS
;========================
NEWIRQ3:			;MET EN PLACE NOTRE ROUTINE 
MOVE.L	EXECBASE,A6		;D'INTERRUPTION
lea	irqstr,a1
move.l	#5,d0
jsr	addintserver(a6)
move.l	d0,irq
beq.s	irqerror
rts
irqerror:
rts
;==========================
STOPIRQ3:			;RESTAURE ANCIENNE ROUTINE
movem.l	a0-a6/d0-d7,-(sp)	;D'INTERRUPTION
	tst.l	irq
	beq.s	irqoff1
	move.l	execbase,a6
	lea	irqstr,a1
	move.l	#32,d0
	jsr	remintserver(a6)
irqoff1:movem.l	(sp)+,a0-a6/d0-d7
	rts
irqstr:
	dc.l	0,0
	dc.b	2,-127
	dc.l	0,irqdat,interrupt
irqdat:	dc.l	0,0,0,0
irq:	dc.l	0
;============================
interrupt:			;NOTRE ROUTINE D'INTERRUPTION	
movem.l	a0-a6/d0-d7,-(sp)

	
movem.l	(sp)+,a0-a6/d0-d7
rts
;============================
OPENLIB:  			;OUVERTURE DE LA LIBRAIRIE GRAPHIQUE
move.l execbase,a6      	;MET ADRESSE EXECBASE DANS A6
lea gfxname,a1			;MET NOM DE LA LIBRAIRIE DANS A1
move.l #$0,d0           	;MET 0 DANS D0
jsr openlibrary(a6)		;OUVRE LIBRAIRIE
tst d0				;TESTE D0
beq.s error			;SI = A 0   VA A ERROR = SORTIE
move.l d0,gfxbase       	;SI NON, MET ADRESSE D0 DANS GFXBASE
add.l #$32,d0			;AJOUTE $32 A CETTE ADRESSE
move.l d0,coppertr      	;MET D0=ADRESSE ACTUELLE LISTE COPPER
rts				;DANS COPPERTR
even
gfxname: dc.b 'graphics.library',0 	;NOM DE LA LIBRAIRIE
even
gfxbase: dc.l 0				;POINTEUR POUR LA GRAPHICS LIBRARY
coppertr: dc.l 0			;POINTEUR POUR ADRESSE LISTE COPPER
;====================
CLOSELIB: 			;FERMETURE LIBRAIRIE
move.l execbase,a6      	;MET ADRESSE EXECBASE DANS A6
move.l gfxbase,a1		;MET NOM DE LA LIBRAIRIE DANS A1
jsr closelibrary(a6)		;FERME LIBRAIRIE
rts
;====================
ERROR:				;SI ERREUR
illegal				;SORTIE
rts
;====================
SETCOPPER:			;MET EN PLACE NOTRE LISTE COPPER
move.l coppertr,a0		;MET ADRESSE ACTUEL COPPER DANS A0
move.l (a0),oldcopper		;MET CONTENU DANS OLDCOPPER
move.l #newcopper,(a0)		;MET NOTRE LISTE COPPER DANS A0
move.w #$81c0,$dff096		;ACTIVE LISTE COPPER
rts		
oldcopper: dc.l 0
;====================
CLRCOPPER:			;RESTAURE ANCIENNE LISTE COPPER
move.l coppertr,a0		;MET ANCIENNE ADRESSE DANS A0
move.l oldcopper,(a0)		;MET CONTENU DANS A0
move.w #$80a0,$dff096		;REACTIVE ANCIENNE COPPER
rts
;====================
WAITBLITTER:			;ROUTINE POUR ATTENDRE QUE LE BLITTER
BTST #14,DMACONR		;EST FINI SON PRECEDENT TRAVAIL
BNE.S WAITBLITTER
RTS
;===================
;; ---- SOUS-PROGRAMMES ----

					;ECRAN 1 A $50000
					;ECRAN 2 A $50000+[46*150*2]
PLFDCHANGE2:	DC.W	0		;MOT DE POIDS FAIBLE DU 1ER ECRAN
		DC.W	50*133*2	;MOT DE POIDS FAIBLE DU 2EME ECRAN


;; ---- STARS Routine ----

STARS:

COORDSCALC2:
	LEA	PLFD2+6,A1	;POINTE A1 SUR LISTE COPPER ECRAN 
	LEA	PLFD3+6,A2	;POINTE A2 SUR LISTE COPPER ECRAN INVERSE

	LEA	PLFDCHANGE2,A3	;POINTE A3 SUR TABLE MOT POIDS FAIBLE

	MOVE.W	(A3),D0		;MET EN PLACE ADRESSE DES ECRANS VISIBLES
	MOVE.W	D0,(A1)		;DANS LISTE COPPER

	MOVE.W D0,D1		;POUR L'ECRAN INVERSE
	ADD.W #130*46*2,D1	;ON DOIT POINTER SUR LA DERNIERE LIGNE
	MOVE.W D1,(A2)

	ADD.W	#46,D0
	MOVE.W	D0,8(A1)

	MOVE.W D0,D1
	ADD.W #130*46*2,D1
	MOVE.W D1,8(A2)

	MOVE.L	(A3),D0
	SWAP	D0
	MOVE.L	D0,(A3)


	BSR	WAITBLITTER	;EFFACE ECRAN NON VISIBLE
	MOVE.W	#$0100,BLTCON0
	MOVE.W	#0,BLTCON1
	MOVE.W	#0,BLTDMOD
	MOVE.L	#ECRAN,D1
	ADD.W	PLFDCHANGE2,D1
	MOVE.L	D1,BLTDPTH
	MOVE.W	#133*2*64+23,BLTSIZE

	BSR	WAITBLITTER	;PREPARE BLITTER POUR AFFICHAGE BOULES
	MOVE.W	#0,BLTCON1
	MOVE.W	#$FFFF,BLTAFWM
	MOVE.W	#$0000,BLTALWM
	MOVE.W	#20-1-1*2,BLTAMOD
	MOVE.W	#23-1-1*2,BLTBMOD
	MOVE.W	#23-1-1*2,BLTDMOD

	LEA	COORDS,A0		;CALCUL DES ADRESSES
	MOVE.W	#STARSNBR-1,D0		;ET AFFICHAGE DES BOULES

STARSLOOP:
	MOVE.L	A0,-(SP)

	SUBQ.W	#STARSSPEED,4(A0)
	MOVE.W	4(A0),D4
	BLS.L	ROUT2

	MOVE.W	(A0)+,D2
	EXT.L	D2
	DIVS	D4,D2
	MOVE.W	(A0)+,D3
	TST.W	(A0)+
	EXT.L	D3
	DIVS	D4,D3

	ADD.W	#176,D2		; CENTRER BORIZONTALEMENT
	BMI.L	ROUT2		; TESTER BORD GAUCHE

	CMP.W	#352,D2		;   --    --  DROIT
	BGE.L	ROUT2

	ADD.W	#124,D3		; CENTRER VERTICALEMENT
	BMI.L	ROUT2

	MULU	#46*2,D3	; ADRESSE DE LA LIGNE (44 OCTETS/LIGNE)

	MOVE.W	D2,D1
	LSR.W	#3,D1		; ADRESSE DANS LA LIGNE

	ADD.W	D1,D3		; ADRESSE FINALE

	TST.W	(A0)+
	MOVE.W	D3,(A0)+

	AND.W	#$F,D2
	ROR.W	#4,D2
	OR.W	#$0DFC,D2

	MOVE.L	#BOULES,D6

	MULU	#12,D4
	LSR.W	#7,D4
	AND.L	#$0000FFFE,D4

FINALADDRESS:
	ADD.L	D4,D6

	LEA	BALLSHEIGHT,A3
	ADD.L	D4,A3

	MOVE.L	#0,D7
	MOVE.W	(A3),D7
	LSL.L	#7,D7
	OR.W	#2,D7
	
	BSR	WAITBLITTER

	MOVE.W	D2,BLTCON0

	MOVE.L	#ECRAN,D5
	ADD.W	PLFDCHANGE2,D5
	ADD.W	D3,D5

	MOVE.L	D6,BLTAPTH
	MOVE.L	D5,BLTBPTH
	MOVE.L	D5,BLTDPTH
	MOVE.W	D7,BLTSIZE
	TST.L	(SP)+

STARSEND:
	DBRA	D0,STARSLOOP

	RTS
 

ROUT2:				;ROUTINE DE CALCUL ALEATOIRE
	MOVE.W	#1000,D7
	MOVE.L	(SP)+,A0
	MOVE.W	#300,4(A0)
	MOVE.B	$DFF007,D5
	MOVE.B	$BFD800,D4	; ENVENT COUNTER DU CIA-B (COMPTE LES
	EOR.B	D5,D4		; IMPULSIONS SYNCHRONES HORIZONTALES,
	EXT.W	D4		; EN TEMPS NORMAL, ELLES ONT UNE 
	ASL.W	#6,D4		; FRéQUENCE DE 15625 PAR SECONDE)
	BMI.S	L1
	ADD.W	D7,D4
	BRA.S	L2
 
L1:	SUB.W	D7,D4

L2:	MOVE.W	D4,(A0)+
	MOVE.B	$BFE801,D4	; COMPTEUR éVéNEMENT (COMPTE LES
	EOR.B	D4,D5		; IMPULSIONS à 50HZ DU COMPTEUR
	EXT.W	D5		; D'ALIMENTATION, QUI DéRIVE DE
	ASL.W	#6,D5		; LA FRéQUENCE DU RéSEAU)
	BMI.S	L3
	NEG.W	D5

L3:	SUB.W	D7,D5
	MOVE.W	D5,(A0)+
	TST.W	(A0)+
	CLR.W	(A0)+
	CLR.W	(A0)+
	BRA.S	STARSEND

;; ---- STARS INIT ROUTINE ----

STARSINIT:			;INITIALISATION DES COORDONNEES DES BOULES
	LEA	COORDS,A0
	MOVE.L	#STARSNBR-1,D0

STARSINITLOOP1:
	MOVE.B	$00DFF007,D5
	MOVE.L	#0,D4
	MOVE.B	$00BFD800,D4
	MOVE.W	D4,4(A0)
	EOR.B	D5,D4
	ASL.W	#6,D4
	MOVE.W	D4,(A0)+
	AND.W	#$00FF,D4

STARSINITLOOP2:
	DBRA	D4,STARSINITLOOP2
	MOVE.B	$00BFE801,D4
	EOR.B	D4,D5
	ASL.W	#6,D5
	BSET	#15,D5
	MOVE.W	D5,(A0)+
	TST.W	(A0)+
	CLR.W	(A0)+
	CLR.W	(A0)+
	DBRA	D0,STARSINITLOOP1
	RTS


BALLSHEIGHT:	;TAILLE DES BOULES EN PIXELS

DC.W	17,17,16,15,14,13,12,11,10,8,7,6,5,4,2,1,1


;====================
EVEN				;NOTRE LISTE COPPER
NEWCOPPER:   
	DC.W	$008E,$3261	;DIMENSIONS DE L'ECRAN
	DC.W	$0090,$32e1	

	DC.W	$0092,$0030,$0094,$00D8
		;MODE OVERSCAN
PLFD2:
	DC.W	$00E0,$0005
	DC.W 	$00E2,$0000
	DC.W	$00E4,$0005
	DC.W	$00E6,$0000


	;REGISTRE POUR CHOISIR RESOLUTION	

	DC.W	$0100,$2200		;2 PLANS+MODE COULEURS

	DC.W	$0102,$0000

	;PRIORITE DES PLANS ET SPRITES - INUTILISE ICI

	DC.W 	$0104,$0000

	;MODULOS DES PLANS

	DC.W	$0108,6+46-4	;MODULOS PLANS PAIRS    OVERSCAN
	DC.W 	$010A,6+46-4	;MODULOS PLANS IMPAIRS	OVERSCAN

	;POINTEURS DES SPRITES - MIS A 0 SI PAS DE SPRITES

	DC.W	$0120,$0000,$0122,$0000
	DC.W	$0124,$0000,$0126,$0000
	DC.W	$0128,$0000,$012A,$0000	;PAS DE SPRITES
	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

	;REGISTRES DES COULEURS

	DC.W	$0180,$0000	;COULEUR 00	;SEULES LES 4 PREMIERES
	DC.W	$0182,$0FFF	;COULEUR 01	;COULEURS SONT UTILISEES
	DC.W	$0184,$034B	;COULEUR 02
	DC.W	$0186,$0017	;COULEUR 03
	
	DC.W	$0188,$0455	;COULEUR 04
	DC.W	$018A,$0333	;COULEUR 05
	DC.W	$018C,$0222	;COULEUR 06
	DC.W	$018E,$0111	;COULEUR 07
	DC.W	$0190,$0EEF	;COULEUR 08
	DC.W	$0192,$0CCF	;COULEUR 09
	DC.W	$0194,$099F	;COULEUR 10
	DC.W	$0196,$055F	;COULEUR 11
	DC.W	$0198,$000F	;COULEUR 12
	DC.W	$019A,$000A	;COULEUR 13
	DC.W	$019C,$0006	;COULEUR 14
	DC.W	$019E,$0003	;COULEUR 15
	DC.W	$01A0,$0DEF	;COULEUR 16	;LES COULEURS DE 16 A 31 SONT
	DC.W	$01A2,$0BEF	;COULEUR 17	;AUSSI CELLES DES SPRITES
	DC.W	$01A4,$0ADF	;COULEUR 18
	DC.W	$01A6,$07BD	;COULEUR 19	;LES COULEURS 16 A 31 NE SONT
	DC.W	$01A8,$058A	;COULEUR 20	;PAS UTILISEES DANS LE MODE
	DC.W	$01AA,$0357	;COULEUR 21	;HOLD AND MODIFY (HAM)
	DC.W	$01AC,$0234	;COULEUR 22
	DC.W	$01AE,$0011	;COULEUR 23
	DC.W	$01B0,$0FD0	;COULEUR 24
	DC.W	$01B2,$0FA0	;COULEUR 25
	DC.W	$01B4,$0E80	;COULEUR 26
	DC.W	$01B6,$0C60	;COULEUR 27
	DC.W	$01B8,$0A30	;COULEUR 28
	DC.W	$01BA,$0720	;COULEUR 29
	DC.W	$01BC,$0510	;COULEUR 30
	DC.W	$01BE,$0300	;COULEUR 31


DC.W $B401,$FFFE

PLFD3:	DC.W	$00E0,$0005		;ECRAN INVERSE
	DC.W 	$00E2,$0000
	DC.W	$00E4,$0005
	DC.W	$00E6,$0000

	;MODULOS POUR AVOIR ECRAN INVERSE
	DC.W	$0108,-40-46-46-4	;MODULOS PLANS PAIRS
	DC.W 	$010A,-40-46-46-4	;MODULOS PLANS IMPAIRS


	;INSTRUCTIONS POUR AVOIR UN ECRAN PAL (256 LIGNES DE HAUT)

	DC.W $FFDF,$FFFE


DC.L $FFFFFFFE ;FIN LISTE COPPER
EVEN



FINDEMO:
