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

InitBitMap = 	-390
InitRastPort =	-198
ClearScreen =	-48
SetAPen =	-342
Text =		-60
Move =		-240

;=====================================================================
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:	BLK.B	256*2*40,0		;RESERVATION MEMOIRE POUR ECRAN

;==================================
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.L NEWIRQ3			;SAUTE SOUS PROGRAMME: MET EN PLACE ROUTINE D'INTERRRUPTION
	
	
	MOVE.L GFXBASE,A6		;ADRESSE GRAPHICS LIBRAIRIE EN A6
	LEA BITMAP,A0			;POINTE BIRMAP SUR A0
	MOVE.L #2,D0			;NOMBRE DE PLANS
	MOVE.L #320,D1			;LARGEUR BITMAP
	MOVE.L #256,D2			;HAUTEUR BITMAP
	JSR INITBITMAP(A6)		;INITIALISATION BITMAP
	
	MOVE.L #IMAGE,PLANE1		;ADRESSE PLAN 1
	MOVE.L #IMAGE+[40*256],PLANE1+4	;ADRESSE PLAN2
	LEA RASTPORT,A1			;POINTE A1 SUR STRUCTURE RASTPORT
	JSR INITRASTPORT(A6)		;INITIALISATION RASTPORT
	
	MOVE.L #BITMAP,R_BITMAP		;ADRESSE BITMAP DANS STRUCTURE BITMAP
	LEA RASTPORT,A1			;POINTE RASTPORT EN A1
	JSR CLEARSCREEN(A6)		;EFFACE ECRAN
	LEA RASTPORT,A1			;POINTE RASTPORT EN A1
	MOVE.L #$02,D0			;CHOISI COULEUR ECRITURE
	JSR SETAPEN(A6)			;INITIALISE COULEUR

	BSR.L	TESTDISKS		;VA A ROUTINE DE TEST LECTEUR
	BSR.L	PRINT_MESSAGE		;VA A ROUTINE AFFICHAGE TEXTE
	BSR.L	TEST_DISKS_IN_DRIVE	;VA A ROUTINE TEST PRESENCE DISQUETTE


WAIT:
	CMP.B #$E0,$DFF006	;ATTENDANT 200 IEME LIGNE RASTER
	BNE.S WAIT		;SINON RETOURNE A WAIT
	
	BTST	#6,$BFE001	;ATTENDANT PRESSION SUR BOUTON GAUCHE SOURIS
	BNE.S	WAIT		;SINON RETOURNE A WAIT
 				;SI OUI  FIN
fin: 				;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
;====================
PRINT_MESSAGE:

	LEA BUFFER,A2			;POINTE A2 SUR BUFFER
	LEA DRIVE0,A3			;POINTE A3 SUR LISTE MESSAGES
	
	MOVE.W #3,D2			;NOMBRE DE MESSAGES -1
PPM:

	MOVE.W (A2),D3			;PREMIER MESSAGE
	
	
	CMP.W #$FFFF,D3			;TESTE SI LECTEUR PRESENT
	BNE SUITE			;SINON ON SAUTE
	MOVE.L 4(A3),STRING		;PLACE MESSAGE DANS STRING
SUITE:


	CMP.W #$0000,D3			;TESTE SI LECTEUR NON PRESENT
	BNE SUITE2			;SINON ON SAUTE
	MOVE.L 0(A3),STRING		;PLACE MESSAGE DANS STRING
SUITE2:

	BSR.L PRINT_TEXT		;VA A ROUTINE AFFICHAGE MESSAGE
	
	ADD.L #10,Y			;DESCEND D'UNE LIGNE
	
	ADD.W #2,A2			;PASSE AU LECTEUR SUIVANT
	ADD.L #4*4,A3			;PASSE A LISTE MESSAGE SUIVANTE
	DBF D2,PPM			

	RTS
;====================
PRINT_TEXT:

	LEA RASTPORT,A1			;POINTE RASTPORT EN A1
	MOVE.L X,D0			;POSITION X
	MOVE.L Y,D1			;POSITION Y
	JSR MOVE(A6)			;PLACE CURSEUR
	
	LEA RASTPORT,A1			;POINTE RASTPORT EN A1
	MOVE.L STRING,A0		;POINTE MESSAGE EN A0
	MOVE.L #34,D0			;NOMBRE DE CARACTERES
	JSR TEXT(A6)			;ECRIT MESSAGE
	
	RTS
;====================
TEST_DISKS_IN_DRIVE:

	MOVE.L #0,D5			; 0 = DRIVE 0
	
	LEA DRIVE0,A4			;POINTE A4 SUR LISTE MESSAGE
	LEA BUFFER,A3			;POINTE A3 SUR BUFFER
	
	MOVE.W #3,D6			;NOMBRE DE DRIVES -1
TD:	
	CLR.L D0			;EFFACE D0
	MOVE.L D5,D0			;PLAVE D5 EN D0
	MOVE.W (A3),D3			;PLACE RESULTAT TEST PRESENCE EN D3
	
	CMP.W #$FFFF,D3			;TESTE SI LECTEUR PRESENT
	BNE TD1				;SINON ON SAUTE
	BSR.L DISK_IN_DRIVE		;SI OUI TEST LA PRESENCE D'UNE DISQUETTE
	
	CMP.L #-1,D0			;SI D0 EN RETOUR N'EST PAS EGAL A $FFFF = -1
	BNE TD3				;ON SAUTE
	MOVE.L	8(A4),STRING		;SINON ON PLACE MESSAGE DANS STRING
TD3:

	CMP.L #0,D0			;SI D0 EN RETOUR N'EST PAS EGAL A 0
	BNE TD4				;ON SAUTE
	MOVE.L	12(A4),STRING		;SINON ON PLACE MESSAGE DANS STRING
TD4:


	BSR.L PRINT_TEXT		;VA A ROUTINE AFFICHAGE TEXTE
TD1:

	ADD.L #1,D5			;PASSE AU NUMERO DU LECTEUR SUIVANT
	
	ADD.W #2,A3			;RESULTAT DANS BUFFER SUIVANT
	ADD.W #4*4,A4			;PASSE A LIGNE DE MESSAGE SUIVANTE
	ADD.L #10,Y			;DESCEND D'UNE LIGNE
	
	DBF D6,TD 
	RTS
;====================
*************************************************
*   
*	TESTE LA PRESENCE D'UN DISQUE DANS LE LECTEUR
*
*    D0 =  0 INDIQUE QU'UN DISQUE EST DANS LE DRIVE
*    D0 = -1 INDIQUE QU'IL N'Y A PAS DE DISQUE DANS LE DRIVE
*
*************************************************

DISK_IN_DRIVE:	MOVEM.L	D1/D2/D3/A4,-(A7)	;SAUVE REGISTRES !
		MOVE.W	D0,DRIVE		;STOCKE NUMERO DRIVE
		BSR.L	DRIVE_ON		;DRIVE ON
		MOVE.L	#$40000,D3
		BTST	#4,$BFDD00
WAIT_INDEX:	BTST	#4,$BFDD00	;ATTEND TROU D'INDEX
		BNE.S	DISK_OK		;AUSSI LONGTEMPS QUE D3 EST > 0
		SUBQ.L	#1,D3
		BPL.S	WAIT_INDEX
DISK_OK:	BSR.L	DRIVE_OFF	;DRIVE OFF
RESULT:		TST.L	D3		;SI D3 EST NEGATIF
		BMI.S	NEGATIVE	;LE TROU D'INDEX N'EST PAS TROUVE
		CLR.L	D0		; => PAS DE DISK DANS LE DRIVE
		BRA.S	END_CHECK
NEGATIVE:	MOVEQ	#-1,D0
END_CHECK:	MOVEM.L	(A7)+,D1/D2/D3/A4
		RTS


DRIVE_ON:	MOVEQ	#1,D0
		BRA.S	CONT_DRIVE
DRIVE_OFF:	CLR.W	D0
CONT_DRIVE:	MOVE.W	DRIVE,D2
		ADDQ.W	#3,D2
		TST.W	D0
		BEQ.S	DRIVE_OUT
		MOVE.B	#%11111001,$BFD100	;DRIVE ON
		BCLR	#7,$BFD100
		BCLR	D2,$BFD100
		RTS
DRIVE_OUT:	BSET	D2,$BFD100		;DRIVE OFF
		BSET	#7,$BFD100
		BCLR	D2,$BFD100
		BSET	D2,$BFD100
		RTS

DRIVE:	DC.W 0


;====================
BUFFER:
	DC.W	0	;DRIVE 0
	DC.W	0	;DRIVE 1
	DC.W	0	;DRIVE 2
	DC.W	0	;DRIVE 3

;====================
TESTDISKS:
	MOVEM.L	D0-D3/A1,-(SP)	; SAUVE LES REGISTRES UTILISéS
	
	LEA BUFFER,A0
	ADDQ.L	#8,A0		; A0 = FIN DU BUFFER PARCE QU'ON
				; TESTE EN SENS INVERSE (DE 3 à 0)
	LEA	$BFD100,A1	; A1 = CIAB-PRB

	MOVEQ	#2,D0		; 3 DRIVES à TESTER (DF3: à DF1:)
TSTDSKS:
	MOVE.B	D0,D1
	ADDQ.B	#4,D1		; D1 = BIT POUR DSKSELX (4 à 6)

	BCLR	#7,(A1)		; DSKMOTOR LOW
	BCLR	D1,(A1)		; DSKSELX LOW
	BSET	D1,(A1)		; DSKSELX HIGH
	BSET	#7,(A1)		; DSKMOTOR HIGH
	BCLR	D1,(A1)		; DSKSELX LOW

	MOVEQ	#0,D2		; D2 = ID
	MOVEQ	#15,D3		; 16 TESTS (1 MOT)
TSTLOOP:
	LSL.L	#1,D2
	BSET	D1,(A1)		; DSKSELX HIGH
	BCLR	D1,(A1)		; DSKSELX LOW
	BTST	#5,$F01(A1)	; = $BFE001 = CIAA-PRA = DSKRDY
	BNE.S	TSTNEXT
	BSET	#0,D2		; MET LE BIT DANS L'ID
TSTNEXT:
	BSET	D1,(A1)		; DSKSELX HIGH
	DBRA	D3,TSTLOOP	; BOUCLE POUR LES 16 BITS

	MOVE.W	D2,-(A0)	; PLACE L'ID DANS LE BUFFER
	DBRA	D0,TSTDSKS	; BOUCLE POUR LES 3 DRIVES

	MOVE.W	D0,-(A0)	; DF0: EST TOUJOURS PRéSENT !
				; ET MIRACLE, A0 POINTE à NOUVEAU
				; LE DéBUT DU BUFFER !

	MOVEM.L	(SP)+,D0-D3/A1	; RéCUPèRE LES REGISTRES
	RTS


;====================
X:		DC.L	20
Y:		DC.L	20
	
STRING:		DC.L	0

BITMAP:		BLK.W 4,0

PLANE1:		BLK.L 10,0

RASTPORT:	BLK.L 1,0

R_BITMAP:	BLK.L 26,0

TEXTE0_0:		DC.B	"LE DRIVE 0 N'EST PAS CONNECTE     ",0	
TEXTE1_0:		DC.B	"LE DRIVE 1 N'EST PAS CONNECTE     ",0
TEXTE2_0:		DC.B	"LE DRIVE 2 N'EST PAS CONNECTE     ",0
TEXTE3_0:		DC.B	"LE DRIVE 3 N'EST PAS CONNECTE     ",0

TEXTE0_1:		DC.B	"LE DRIVE 0 EST CONNECTE           ",0
TEXTE1_1:		DC.B	"LE DRIVE 1 EST CONNECTE           ",0
TEXTE2_1:		DC.B	"LE DRIVE 2 EST CONNECTE           ",0
TEXTE3_1:		DC.B	"LE DRIVE 3 EST CONNECTE           ",0

DISK0_0:		DC.B	"LE DRIVE 0 NE CONTIENT PAS DE DISK",0
DISK1_0:		DC.B	"LE DRIVE 1 NE CONTIENT PAS DE DISK",0
DISK2_0:		DC.B	"LE DRIVE 2 NE CONTIENT PAS DE DISK",0
DISK3_0:		DC.B	"LE DRIVE 3 NE CONTIENT PAS DE DISK",0

DISK0_1:		DC.B	"LE DRIVE 0 CONTIENT UN DISK       ",0;
DISK1_1:		DC.B	"LE DRIVE 1 CONTIENT UN DISK       ",0
DISK2_1:		DC.B	"LE DRIVE 2 CONTIENT UN DISK       ",0
DISK3_1:		DC.B	"LE DRIVE 3 CONTIENT UN DISK       ",0

DRIVE0:			DC.L	TEXTE0_0,TEXTE0_1,DISK0_0,DISK0_1
DRIVE1:			DC.L	TEXTE1_0,TEXTE1_1,DISK1_0,DISK1_1
DRIVE2:			DC.L	TEXTE2_0,TEXTE2_1,DISK2_0,DISK2_1
DRIVE3:			DC.L	TEXTE3_0,TEXTE3_1,DISK3_0,DISK3_1

DISK_IN_0:		DC.L	0
DISK_IN_1:		DC.L	0
DISK_IN_2:		DC.L	0
DISK_IN_3:		DC.L	0


;====================
	EVEN				;NOTRE LISTE COPPER
NEWCOPPER:
	DC.W	$008E,$2c81	;DIMENSIONS DE L'ECRAN
	DC.W	$0090,$2cc1	;256 LIGNES

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

	;POINTEURS ADRESSE DES PLANS DE L'IMAGE

	DC.W $00E0,IMAGE+[40*256*0]/65536
	DC.W $00E2,IMAGE+[40*256*0] & 65535   
	DC.W $00E4,IMAGE+[40*256*1]/65536
	DC.W $00E6,IMAGE+[40*256*1] & 65535


	;REGISTRE POUR CHOISIR RESOLUTION	

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

	;DECALAGE ECRAN - INUTILISE ICI

	DC.W	$0102,$0000

	;PRIORITE DES PLANS ET SPRITES - INUTILISE ICI

	DC.W 	$0104,$0000

	;MODULOS DES PLANS

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

	;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
	DC.W	$0182,$0024	;COULEUR 01
	DC.W	$0184,$0135	;COULEUR 02
	DC.W	$0186,$0246	;COULEUR 03
	DC.W	$0188,$0357	;COULEUR 04
	DC.W	$018A,$0468	;COULEUR 05
	DC.W	$018C,$0579	;COULEUR 06
	DC.W	$018E,$068a	;COULEUR 07
	DC.W	$0190,$079b	;COULEUR 08
	DC.W	$0192,$08ac	;COULEUR 09
	DC.W	$0194,$09bd	;COULEUR 10
	DC.W	$0196,$0ace	;COULEUR 11
	DC.W	$0198,$0cdf	;COULEUR 12
	DC.W	$019A,$0eef	;COULEUR 13
	DC.W	$019C,$0800	;COULEUR 14
	DC.W	$019E,$0a00	;COULEUR 15
	DC.W	$01A0,$0c20	;COULEUR 16	;LES COULEURS DE 16 A 31 SONT
	DC.W	$01A2,$0e40	;COULEUR 17	;AUSSI CELLES DES SPRITES
	DC.W	$01A4,$0200	;COULEUR 18
	DC.W	$01A6,$0400	;COULEUR 19	;LES COULEURS 16 A 31 NE SONT
	DC.W	$01A8,$0600	;COULEUR 20	;PAS UTILISEES DANS LE MODE
	DC.W	$01AA,$0810	;COULEUR 21	;HOLD AND MODIFY (HAM)
	DC.W	$01AC,$0920	;COULEUR 22
	DC.W	$01AE,$0a30	;COULEUR 23
	DC.W	$01B0,$0b40	;COULEUR 24
	DC.W	$01B2,$0c51	;COULEUR 25
	DC.W	$01B4,$0d62	;COULEUR 26
	DC.W	$01B6,$0e73	;COULEUR 27
	DC.W	$01B8,$0f84	;COULEUR 28
	DC.W	$01BA,$0f95	;COULEUR 29
	DC.W	$01BC,$0fa6	;COULEUR 30
	DC.W	$01BE,$0fb7	;COULEUR 31

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

	DC.W $FFDF,$FFFE

	DC.L $FFFFFFFE ;FIN LISTE COPPER
	EVEN


FINDEMO:
