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

>EXTERN "PIC_RAW",IMAGE

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
;==================================
IMAGE=$40000			;L'IMAGE SE TROUVE A $40000

FINDATA=IMAGE+[40*200*5]	;FIN DES DATAS APRES L'IMAGE
			
;==================================
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

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 #$F0,$DFF006
BNE.S WAIT

BTST	#6,$BFE001		;TESTE BOUTON GAUCHE SOURIS
BEQ.S	END

BTST 	#10,$DFF016		;TESTE BOUTON DROIT SOURIS
BEQ.S	END

JMP WAIT

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)

BSR.L SOURIS
	
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
;====================
SOURIS:
	BSR	MOUSE		;VA A ROUTINE DE CALCUL POSITION

	LEA	MOUSEX,A0	;POSITION X DANS A0
	BTST	#0,D7		;SI PAS VERS LA DROITE
	BEQ.S	MOV_M2		;ON PASSE
	ADD.W	D6,(A0)		;AJOUTE DEPLACEMENT A POSITION X
	CMP.W	#450,(A0)	;SI INFERIEUR A 450
	BLE.S	MOV_M3		;ON PASSE
	MOVE.W	#450,(A0)	;SINON MET POSITION X A 450 
	BRA.S	MOV_M3		;VA A TEST POSITION Y
MOV_M2:
	BTST	#1,D7		;SI PAS VERS LA GAUCHE
	BEQ.S	MOV_M3		;ON PASSE
	SUB.W	D6,(A0)		;SOUSTRAIT DEPLACEMENT A POSITION X
	CMP.W	#126,(A0)	;SI SUPERIEUR A 126
	BGE.S	MOV_M3		;ON PASSE
	MOVE.W	#126,(A0)	;SINON MET POSITION X A 126        
MOV_M3:
	LEA	MOUSEY,A0	;POSITION Y DANS A0
	BTST	#2,D7		;SI PAS VERS LE BAS
	BEQ.S	MOV_M4		;ON PASSE
	ADD.W	D5,(A0)		;AJOUTE DEPLACEMENT A POSITION Y
	CMP.W	#$f0,(A0)	;SI INFERIEUR A $F0 (200)
	BLE.S	MOV_M5		;ON PASSE
	MOVE.W	#$f0,(A0)	;SINON MET POSITION Y A 200 
	BRA.S	MOV_M5		;VA A FIN TEST
MOV_M4:
	BTST	#3,D7		;SI PAS VERS LE HAUT
	BEQ.S	MOV_M5		;ON PASSE
	SUB.W	D5,(A0)		;SOUSTRAIT DEPLACEMENT A POSITION Y
	CMP.W	#$29,(A0)	;SI SUPERIEUR A $29
	BGE.S	MOV_M5		;ON PASSE
	MOVE.W	#$29,(A0)	;SINON MET POSITION Y A $29        
MOV_M5:

	LEA	SPRDATA,A4	;POINTE A4 SUR STRCUTURE SPRITE
	MOVE.W	MOUSEX,D7	;POSITION X EN D7
	MOVE.W	MOUSEY,D6	;POSITION Y EN D6
	MOVE.W	#16,D5		;HAUTEUR DU SPRITE EN D5
	BSR.L	SPRITES		;VA A ROUTINE CALCUL COORDONNEES SPRITE
	rts

;ROUTINE DE DETECTION DE MOUVEMENT DE LA SOURIE
MOUSE:
	MOVEQ	#0,D7
	MOVE.W	$dff00a,D0
	MOVE.W	D0,D1
	AND.W	#%11111111,D1
	MOVE.W	OLD_MX,D2
	MOVE.W	D1,OLD_MX
	CMP.W	D2,D1		;OLDX=OLDX-CURRENT
	BGT.S	MOUSE2		;BR SI CURRENT PLUS GRAND
	BLT.S	MOUSE3		;BR SI CURRENT PLUS PETIT
				;AUCUN CHANGEMENT
	MOVEQ	#0,D6		;D6=XSPEED
	BRA.S	MOUSE4
MOUSE2:
	SUB.W	D2,D1		;CURRENT=CURRENT-OLD
	CMP.W	#127,D1		;EST-CE PLUS GRAND QUE 127
	BGT.S	MOUSE2B		;BR SI OUI
				;C'EST PLUS PETIT
	MOVE.W	D1,D6		;D6=XSPEED
	BSET	#0,D7		;DIRECTION
	BRA.S	MOUSE4
MOUSE2B:
				;C'EST PLUS PETIT QUE 127
	MOVE.W	#256,D6
	SUB.W	D1,D6		;256-(>127)
	BSET	#1,D7
	BRA.S	MOUSE4
MOUSE3:
	SUB.W	D1,D2		;OLD=OLD-CURRENT
	CMP.W	#127,D2		;EST-CE PLUS GRAND QUE 127
	BGT.S	MOUSE3B
				;C'EST PLUS PETIT
	MOVE.W	D2,D6
	BSET	#1,D7
	BRA.S	MOUSE4
MOUSE3B:
				;C'EST PLUS PETIT QUE 127
	MOVE.W	#256,D6
	SUB.W	D2,D6		;256-(>127)
	BSET	#0,D7
	BRA.S	MOUSE4

MOUSE4:
	LSR.W	#8,D0
	MOVE.W	OLD_MY,D2
	MOVE.W	D0,OLD_MY
	CMP.W	D2,D0		;OLDX=OLDX-CURRENT
	BGT.S	MOUSE5		;BR SI CURRENT PLUS GRAND
	BLT.S	MOUSE6		;BR SI CURRENT PLUS PETIT
				;AUCUN CHANGEMENT
	MOVEQ	#0,D5		;D5=XSPEED
	BRA.S	MOUSE7
MOUSE5:
	SUB.W	D2,D0		;CURRENT=CURRENT-OLD
	CMP.W	#127,D0		;EST-CE PLUS GRAND QUE 127
	BGT.S	MOUSE5B		;BR SI OUI
				;C'EST PLUS PETIT
	MOVE.W	D0,D5		;D5=XSPEED
	BSET	#2,D7		;DIRECTION
	BRA.S	MOUSE7
MOUSE5B:
				;C'EST PLUS PETIT QUE 127
	MOVE.W	#256,D5
	SUB.W	D0,D5		;256-(>127)
	BSET	#3,D7
	BRA.S	MOUSE7
MOUSE6:
	SUB.W	D0,D2		;OLD=OLD-CURRENT
	CMP.W	#127,D2		;EST-CE PLUS GRAND QUE 127
	BGT.S	MOUSE6B
				;C'EST PLUS PETIT
	MOVE.W	D2,D5
	BSET	#3,D7
	BRA.S	MOUSE7
MOUSE6B:
				;C'EST PLUS PETIT QUE 127
	MOVE.W	#256,D5
	SUB.W	D2,D5		;256-(>127)
	BSET	#2,D7
MOUSE7:
	RTS

;RETOUR: D7=DIRECTION BIT# N. 0=DROITE , 1=GAUCHE , 2=BAS , 3=HAUT
;D6=SPEED EN X , D5=SPEED EN Y

;=================================================================

;A4=ADRESSE OU SE TROUVE LES DATAS
;D7 ET D6 SONT LES POSITION X ET Y (WORDS), D5 HAUTEUR DU SPRITE
;USE : A4,D7,D6,D5,D4=LES DEUX 16 BITS DE CONTROLE A METTRE

SPRITES:
			;CREER VARIABLE VSTOP D'APRES LA HAUTEUR
	MOVEQ	#0,D4
	ADDA.W	D6,D5
	ADD.W	#1,D5	;TROUVE BONNE HAUTEUR
	MOVE.W	D5,D4
	ROL.W	#8,D4
	LSL.B	#1,D4	;OK VSTOP
	SWAP	D4 
	MOVE.B	D6,D4
	BTST	#8,D6
	BEQ.S	SPRITES2
	BSET	#18,D4
SPRITES2:
	LSL.W	#8,D4	;OK POUR VSTART
	BTST	#0,D7
	BEQ.S	SPRITES3
	BSET	#16,D4
SPRITES3:
	LSR.W	#1,D7
	MOVE.B	D7,D4
	SWAP	D4	;ET LE TOUR EST JOUE ! RAPIDE ET SIMPLE
	MOVE.L	D4,(A4)
	RTS


EVEN
SPRDATA:	;IMAGE DE NOTRE SPRITE
DC.W	0,0	;VSTART,VSTOP,HSTART
dc.w %1111111111100000,%1111111111100000
dc.w %1111111111000000,%1000000001000000
dc.w %1111111110000000,%1000000010000000
dc.w %1111111100000000,%1000000100000000
dc.w %1111111100000000,%1000001100000000
dc.w %1111111110000000,%1000010010000000
dc.w %1111111111000000,%1000100001000000
dc.w %1111011111100000,%1001010000100000
dc.w %1110001111110000,%1010001000010000
dc.w %1100000111111000,%1100000100001000
dc.w %1000000011111100,%1000000010000100
dc.w %0000000001111110,%0000000001000010
dc.w %0000000000111111,%0000000000100001
dc.w %0000000000011111,%0000000000010001
dc.w %0000000000001111,%0000000000001001
dc.w %0000000000000111,%0000000000000101
DC.W	0,0 
EVEN

MOUSEX:	DC.W	0
MOUSEY:	DC.W	0
OLD_MX:	DC.W	1
OLD_MY:	DC.W	1

;====================
EVEN				;NOTRE LISTE COPPER
NEWCOPPER:
	DC.W	$008E,$2981	;DIMENSIONS DE L'ECRAN
	DC.W	$0090,$f1D1	;200 LIGNES

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

	;POINTEURS ADRESSE DES PLANS DE L'IMAGE

	DC.W $00E0,IMAGE+[40*200*0]/65536
	DC.W $00E2,IMAGE+[40*200*0] & 65535
	DC.W $00E4,IMAGE+[40*200*1]/65536
	DC.W $00E6,IMAGE+[40*200*1] & 65535
	DC.W $00E8,IMAGE+[40*200*2]/65536
	DC.W $00EA,IMAGE+[40*200*2] & 65535
	DC.W $00EC,IMAGE+[40*200*3]/65536
	DC.W $00EE,IMAGE+[40*200*3] & 65535
	DC.W $00F0,IMAGE+[40*200*4]/65536
	DC.W $00F2,IMAGE+[40*200*4] & 65535


	;REGISTRE POUR CHOISIR RESOLUTION	

	DC.W	$0100,$5200		;5 PLANS+MODE COULEURS

	;DECALAGE ECRAN - INUTILISE ICI

	DC.W	$0102,$0000

	;PRIORITE DES PLANS ET SPRITES - SPRITE DEVANT IMAGE

	DC.W 	$0104,$003f
	;DC.W $104,%0000000000111111

	;MODULOS DES PLANS

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

	;POINTEURS DES SPRITES 

	DC.W	$0120,SPRDATA/65536
	DC.W	$0122,SPRDATA&65535


	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
	DC.W	$0182,$0AAA	;COULEUR 01
	DC.W	$0184,$006B	;COULEUR 02
	DC.W	$0186,$04A0	;COULEUR 03
	DC.W	$0188,$0C80	;COULEUR 04
	DC.W	$018A,$0E90	;COULEUR 05
	DC.W	$018C,$0FA0	;COULEUR 06
	DC.W	$018E,$0EC0	;COULEUR 07
	DC.W	$0190,$0DE0	;COULEUR 08
	DC.W	$0192,$0CD0	;COULEUR 09
	DC.W	$0194,$08D0	;COULEUR 10
	DC.W	$0196,$05C0	;COULEUR 11
	DC.W	$0198,$0DED	;COULEUR 12
	DC.W	$019A,$0BDB	;COULEUR 13
	DC.W	$019C,$09B9	;COULEUR 14
	DC.W	$019E,$0EE9	;COULEUR 15
	DC.W	$01A0,$0F01	;COULEUR 16	;LES COULEURS DE 16 A 31 SONT
	DC.W	$01A2,$0F80	;COULEUR 17	;AUSSI CELLES DES SPRITES
	DC.W	$01A4,$0FF0	;COULEUR 18
	DC.W	$01A6,$00F0	;COULEUR 19	;LES COULEURS 16 A 31 NE SONT
	DC.W	$01A8,$00FF	;COULEUR 20	;PAS UTILISEES DANS LE MODE
	DC.W	$01AA,$000F	;COULEUR 21	;HOLD AND MODIFY (HAM)
	DC.W	$01AC,$080F	;COULEUR 22
	DC.W	$01AE,$0F0F	;COULEUR 23
	DC.W	$01B0,$0111	;COULEUR 24
	DC.W	$01B2,$0333	;COULEUR 25
	DC.W	$01B4,$0555	;COULEUR 26
	DC.W	$01B6,$0777	;COULEUR 27
	DC.W	$01B8,$0999	;COULEUR 28
	DC.W	$01BA,$0BBB	;COULEUR 29
	DC.W	$01BC,$0DDD	;COULEUR 30
	DC.W	$01BE,$0FFF	;COULEUR 31

DC.L $FFFFFFFE ;FIN LISTE COPPER
EVEN
FINDEMO:
