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

;=====================
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
;==================================
ECRAN=$40000		;EMPLACEMENT IMAGE
			;320 * 256 EN 1 PLAN
;==================================
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			;EFFACE ECRAN
MOVE.W #[40*256]/2-1,D0
CLEAR_ECRAN:
MOVE.W #0,(A0)+
DBF D0,CLEAR_ECRAN

BSR.L INITSPRITES		;INITILISATION DES SPRITES

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 #$E0,$DFF006		;ATTENDANT 200 IEME LIGNE RASTER
BNE.S WAIT			;SINON RETOURNE A WAIT

BSR.L STARMOV

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
;====================
INITSPRITES:
					
	LEA 	SPRITE0,A0	;POINTE A0 SUR STRUCTURE SPRITE 0
	LEA	SPRITE1,A1	;POINTE A1 SUR STRUCTURE SPRITE 1
	MOVE.L 	#$36004600,D0	;$36 = SPRITE DEBUTE EN LIGNE $36
				;$46 = FIN DU SPRITE EN LIGNE $46	
	MOVEQ 	#11,D1		;12 SPRITES DANS LE SENS VERTICAL	
SPR01LP:	SWAP	D0	;POSITION X ALEATOIRE
	MOVE.B 	$DFF007,D2
	EOR.B 	D2,D0
	SWAP 	D0		;MOTS DE CONTROLE OK

	MOVE.L D0,(A0)+		;MET LES 2 MOTS DE CONTROLE DANS STRUCTURE SPRITE 0
	ADD.L #$80,D0		;AJOUTE $80 AU SPRITE 1 = SPRITE 16 COULEURS
				;VOIR COURS ASM 3
	MOVE.L D0,(A1)+		;MET MOTS DE CONTROLE DANS STUCTURE SPRITE 1
	MOVE.L #$000003C0,(A0)+	;PREMIER MOT DE DONNEES = DESSIN DU SPRITE 0
	MOVE.L #$03800E50,(A0)+
	MOVE.L #$0E4032C8,(A0)+
	MOVE.L #$17487EE4,(A0)+
	MOVE.L #$1E6464C2,(A0)+
	MOVE.L #$7F20CB24,(A0)+
	MOVE.L #$3B5266E1,(A0)+
	MOVE.L #$0A421211,(A0)+
	MOVE.L #$164C30A0,(A0)+
	MOVE.L #$5D5679D1,(A0)+
	MOVE.L #$3F748FB4,(A0)+
	MOVE.L #$7CB82D5A,(A0)+
	MOVE.L #$237C4D00,(A0)+
	MOVE.L #$0CD01008,(A0)+
	MOVE.L #$0B601098,(A0)+
	MOVE.L #$02000460,(A0)+	;16 LIGNES DE HAUT

	MOVE.L #$03C003C0,(A1)+	;PREMIER MOT DE DONNEES DU SPRITE 1
	MOVE.L #$0DD00FF0,(A1)+
	MOVE.L #$3F083DF8,(A1)+
	MOVE.L #$632C7DFC,(A1)+
	MOVE.L #$652E7FFE,(A1)+
	MOVE.L #$A8CCFFFE,(A1)+
	MOVE.L #$019FFFFF,(A1)+
	MOVE.L #$7DFFFFFF,(A1)+
	MOVE.L #$C9ECFFFF,(A1)+
	MOVE.L #$96AFFFFF,(A1)+
	MOVE.L #$F0CAFFFE,(A1)+
	MOVE.L #$53867FFE,(A1)+
	MOVE.L #$7EFC7FFC,(A1)+
	MOVE.L #$1FF83FFC,(A1)+
	MOVE.L #$1FF81FF8,(A1)+
	MOVE.L #$066007E0,(A1)+	;16 LIGNES DE HAUT

	SUB.L #$80,D0		;SOUSTRAIT $80 (SPRITE 16 COULEURS)	
	ADD.L #$11001100,D0	;AJOUTE HAUTEUR + 1 AUX 2 MOTS DE CONTROLES
	DBRA D1,SPR01LP		;ET RECOMMENCE

	MOVE.L #SPRITE0,D0	;PLACE ADRESSE STRUCTURE SPRITE 0
	MOVE.W D0,SP0L		;DANS POINTEURS SPRITES
	SWAP D0			;DE LA COPPER LIST               
	MOVE.W D0,SP0H

	MOVE.L #SPRITE1,D0	;PLACE ADRESSE STRUCTURE SPRITE 0
	MOVE.W D0,SP1L		;DANS POINTEURS SPRITES
	SWAP D0			;DE LA COPPER LIST               
	MOVE.W D0,SP1H

;--------------------------
	LEA 	SPRITE2,A0	;IDEM POUR LES PAIRES DE SPRITES SUIVANTES
	LEA	SPRITE3,A1	;SEULS LE NOMBRE DE SPRITES,LA HAUTEUR	
	MOVE.L 	#$36003E00,D0	;ET LES DONNEES CHANGENT	
	MOVEQ 	#21,D1			
SPR23LP:	SWAP	D0
	MOVE.B 	$DFF007,D2
	EOR.B 	D2,D0
	SWAP 	D0

	MOVE.L D0,(A0)+
	ADD.L #$80,D0
	MOVE.L D0,(A1)+
	MOVE.L #$18003400,(A0)+	;1
	MOVE.L #$34009D00,(A0)+
	MOVE.L #$AB007800,(A0)+
	MOVE.L #$A200BC80,(A0)+
	MOVE.L #$55006C00,(A0)+
	MOVE.L #$95807A00,(A0)+
	MOVE.L #$EE002600,(A0)+
	MOVE.L #$08002000,(A0)+
	MOVE.L #$2C003C00,(A1)+	;1
	MOVE.L #$D300EF00,(A1)+
	MOVE.L #$A700FF00,(A1)+
	MOVE.L #$5380FF80,(A1)+
	MOVE.L #$CB00FF80,(A1)+
	MOVE.L #$CC80FF80,(A1)+
	MOVE.L #$D900FF00,(A1)+
	MOVE.L #$3C00FF00,(A1)+

	SUB.L #$80,D0
	ADD.L #$09000900,D0	
	DBRA D1,SPR23LP	

	MOVE.L #SPRITE2,D0
	MOVE.W D0,SP2L
	SWAP D0
	MOVE.W D0,SP2H

	MOVE.L #SPRITE3,D0
	MOVE.W D0,SP3L
	SWAP D0
	MOVE.W D0,SP3H
	
;--------------------------
	LEA 	SPRITE4,A0
	LEA	SPRITE5,A1	
	MOVE.L 	#$36003A00,D0		
	MOVEQ 	#38,D1			
SPR45LP:	SWAP	D0
	MOVE.B 	$DFF007,D2
	EOR.B 	D2,D0
	SWAP 	D0

	MOVE.L D0,(A0)+
	ADD.L #$80,D0
	MOVE.L D0,(A1)+
	MOVE.L #$40006000,(A0)+	;1
	MOVE.L #$1000C000,(A0)+
	MOVE.L #$F0002000,(A0)+
	MOVE.L #$20002000,(A0)+
	MOVE.L #$20006000,(A1)+	;1
	MOVE.L #$3000F000,(A1)+
	MOVE.L #$1000F000,(A1)+
	MOVE.L #$40006000,(A1)+

	SUB.L #$80,D0
	ADD.L #$05000500,D0	
	DBRA D1,SPR45LP	

	MOVE.L #SPRITE4,D0
	MOVE.W D0,SP4L
	SWAP D0
	MOVE.W D0,SP4H

	MOVE.L #SPRITE5,D0
	MOVE.W D0,SP5L
	SWAP D0
	MOVE.W D0,SP5H
	
;-------------------------
	LEA 	SPRITE6,A0
	LEA	SPRITE7,A1	
	MOVE.L 	#$36003800,D0		
	MOVEQ 	#68,D1			
SPR67LP:	SWAP	D0
	MOVE.B 	$DFF007,D2
	EOR.B 	D2,D0
	SWAP 	D0

	MOVE.L D0,(A0)+
	ADD.L #$80,D0
	MOVE.L D0,(A1)+
	MOVE.L #$40006000,(A0)+	;1
	MOVE.L #$1000C000,(A0)+
	MOVE.L #$20006000,(A1)+	;1
	MOVE.L #$3000F000,(A1)+

	SUB.L #$80,D0
	ADD.L #$03000300,D0	
	DBRA D1,SPR67LP	

	MOVE.L #SPRITE6,D0
	MOVE.W D0,SP6L
	SWAP D0
	MOVE.W D0,SP6H

	MOVE.L #SPRITE7,D0
	MOVE.W D0,SP7L
	SWAP D0
	MOVE.W D0,SP7H
	

RTS

;====================
STARMOV:	

MOVE01:
LEA SPRITE0,A0		;DEPLACE LES SPRITES 0 ET 1 
LEA SPRITE1,A1		;A UNE VITESSE DE 2*4 PIXELS
MOVEQ #11,D0		;VOIR COURS ASM 3
PLUS01:
SUBQ.B #$04,1(A1)
SUBQ.B #$04,1(A0)
CMP.B #$10,1(A0)
Bhi.S OKPLUS01
MOVE.B #$F0,1(A0)
MOVE.B #$F0,1(A1)
OKPLUS01:
ADD.W #68,A0
ADD.W #68,A1
DBF D0,PLUS01

MOVE23:
LEA SPRITE2,A0
LEA SPRITE3,A1
MOVEQ #21,D0
PLUS23:
SUBQ.B #$03,1(A1)	;VITESSE 2*3 PIXELS
SUBQ.B #$03,1(A0)
CMP.B #$10,1(A0)
Bhi.S OKPLUS23
MOVE.B #$F0,1(A0)
MOVE.B #$F0,1(A1)
OKPLUS23:
ADD.W #36,A0
ADD.W #36,A1
DBF D0,PLUS23

MOVE45:
LEA SPRITE4,A0
LEA SPRITE5,A1
MOVEQ #38,D0
PLUS45:
SUBQ.B #$02,1(A1)	;VITESSE 2*2 PIXELS
SUBQ.B #$02,1(A0)
CMP.B #$10,1(A0)
Bhi.S OKPLUS45
MOVE.B #$F0,1(A0)
MOVE.B #$F0,1(A1)
OKPLUS45:
ADD.W #20,A0
ADD.W #20,A1
DBF D0,PLUS45

MOVE67:
LEA SPRITE6,A0
LEA SPRITE7,A1
MOVEQ #68,D0
PLUS67:
SUBQ.B #$01,1(A1)	;VITESSE 2*1 PIXELS
SUBQ.B #$01,1(A0)
CMP.B #$10,1(A0)
Bhi.S OKPLUS67
MOVE.B #$F0,1(A0)
MOVE.B #$F0,1(A1)
OKPLUS67:
ADD.W #12,A0
ADD.W #12,A1
DBF D0,PLUS67

RTS

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

	DC.W	$0092,$0038,$0094,$00D0

	;ADRESSE DE L'ECRAN

	DC.W	$00E0,$0004
	DC.W 	$00E2,$0000

	;REGISTRE POUR CHOISIR RESOLUTION	

	DC.W	$0100,$1200		;1 PLANS+ MODE COULEURS

	DC.W	$0102,$0000

	;PRIORITE DES PLANS ET SPRITES - INUTILISE ICI

	DC.W 	$0104,$0000

	;MODULOS DES PLANS

	DC.W	$0108,0		;MODULOS PLANS PAIRS  
	DC.W 	$010A,0		;MODULOS PLANS IMPAIRS	

	;POINTEURS DES SPRITES 

	DC.W	$120
SP0H:	DC.W	0,$122
SP0L:	DC.W	0,$124
SP1H:	DC.W	0,$126
SP1L:	DC.W	0,$128
SP2H:	DC.W	0,$12A
SP2L:	DC.W	0,$12C
SP3H:	DC.W	0,$12E
SP3L:	DC.W	0,$130
SP4H:	DC.W	0,$132
SP4L:	DC.W	0,$134
SP5H:	DC.W	0,$136
SP5L:	DC.W	0,$138
SP6H:	DC.W	0,$13A
SP6L:	DC.W	0,$13C
SP7H:	DC.W	0,$13E
SP7L:	DC.W	0

	;REGISTRES DES COULEURS

	DC.W	$0180,$0222	;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

	;16 COULEURS DES SPRITES
	
	DC.W $01A0,$0000	;COULEUR 16	;LES COULEURS DE 16 A 31 SONT
	DC.W $01A2,$0015	;COULEUR 17	;AUSSI CELLES DES SPRITES
	DC.W $01A4,$0135	;COULEUR 18
	DC.W $01A6,$0246	;COULEUR 19	;LES COULEURS 16 A 31 NE SONT
	DC.W $01A8,$0468	;COULEUR 20	;PAS UTILISEES DANS LE MODE
	DC.W $01AA,$068a	;COULEUR 21	;HOLD AND MODIFY (HAM)
	DC.W $01AC,$08ac	;COULEUR 22
	DC.W $01AE,$0ace	;COULEUR 23
	DC.W $01B0,$0310	;COULEUR 24
	DC.W $01B2,$0da2	;COULEUR 25
	DC.W $01B4,$0c70	;COULEUR 26
	DC.W $01B6,$0b50	;COULEUR 27
	DC.W $01B8,$0a40	;COULEUR 28
	DC.W $01BA,$0830	;COULEUR 29
	DC.W $01BC,$0520	;COULEUR 30
	DC.W $01BE,$0def	;COULEUR 31

	dc.w $3601,$fffe,$0180,000

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

	DC.W $FFDF,$FFFE

	DC.W $180,$222


	

DC.L $FFFFFFFE ;FIN LISTE COPPER

EVEN	
;RESERVATION DE MEMOIRE POUR STRUCTURES SPRITES
sprite0:	blk.l 17*20
sprite1:	blk.l 17*20
sprite2: 	blk.l 17*20
sprite3: 	blk.l 17*20
sprite4:	blk.l 17*20
sprite5:	blk.l 17*20
sprite6:	blk.l 17*20
sprite7:	blk.l 17*20
EVEN


FINDEMO:
