* ######################################################################
* FPATCH 1.0
* ######################################################################

	SECTION TEXT 

* CALCUL DE LA TAILLE DU PROGRAMME
      		
      	MOVE.L 	4(A7),A4
      	MOVE.L	12(A4),D6 
      	ADD.L   20(A4),D6 
      	ADD.L   28(A4),D6 
      	ADD.L   #256,D6

* SUPERVISEUR

      	PEA	0.W 
      	MOVE.W  #$20,-(A7)
      	TRAP    #1
      	ADDQ.L  #6,A7 
      	MOVE.L  D0,D7 

* VERIFIE VERSION DU TOS

      	MOVE.L 	$4F2.W,A0 		* A0 = HEADER TOS
      	MOVE.L 	8(A0),A0		* A0 = ADRESSE TOS
      	MOVE.W  2(A0),D0		* D0 = VERSION DU TOS
      	SUB.W   #$400,D0		* TOS < 4.00 ?
      	BMI	BAD_TOS			* OUI -> SAUT
      	CMP.W   #5,D0 			* SUPERIEUR OU EGAL A 4.05 ?
      	BGE	BAD_TOS 		* OUI -> SAUT

* ----------------------------------------------------------------------
* INITIALISATION DU SON
* ----------------------------------------------------------------------

* CONNECTE LA MATRICE

      	MOVE.W 	#1,-(A7)		* NO HANDCHECK
      	CLR.W  	-(A7)			* PRESCALE=0
      	CLR.W	-(A7)			* HORLOGE 25.175 MHZ
      	MOVE.W  #8,-(A7)		* DESTINATION DAC
      	CLR.W	-(A7)			* SOURCE DMAPLAY
      	MOVE.W  #139,-(A7)		* FONCTION DEVCONNECT
      	TRAP    #14 		 
      	LEA	12(A7),A7		

* INITIALISE LE MODE SONORE

      	CLR.W   -(A7) 			* 8 BITS STEREO
      	MOVE.W  #132,-(A7)		* FONCTION SETMODE
      	TRAP    #14 
      	ADDQ.L  #4,A7 

* INITIALISE GAINS EN ENTREE GAUCHE / DROITE

      	MOVE.W  #64,-(A7)	
      	MOVE.W  #2,-(A7)		* LTGAIN
      	MOVE.W  #130,-(A7)		* FONCTION SOUNDCMD
      	TRAP    #14
      	MOVE.W  #3,2(A7)		* RTGAIN
      	TRAP    #14 
      	ADDQ.L  #6,A7 
      
* INITIALISE PREDIVISION (PRESCALE DANS DEVCONNECT=0)
      
      	MOVE.W  #3,-(A7)		* 50 KHZ
      	MOVE.W  #6,-(A7)		* SETPRESCALE
      	MOVE.W  #130,-(A7)		* FONCTION SOUNDCMD
      	TRAP    #14 

* INITIALISE ADDER SUR MATRICE+ADC

      	MOVE.W  #4,2(A7)		* FONCTION ADDERIN
      	TRAP    #14
      
* INITIALISE ENTREE ADC SUR PSG
 
      	MOVE.W  #5,2(A7)		* FONCTION ADCINPUT
      	TRAP    #14
      	ADDQ.W  #6,A7 

* -----------------------------------------------------------------------
* CORRIGE BUG BCONMAP
* -----------------------------------------------------------------------

      	MOVE.L  $B4.W,OLD_BIOS		* SAUVE VECTEUR BIOS 
      	MOVE.L	#NEW_BIOS,$B4.W		* INSTALLE NOUVEAU


* FIN DU PROGRAMME

      	MOVE.L  D7,-(A7)		* PILE USER 
      	MOVE.W  #$20,-(A7)		* REPASSE EN USER MODE
      	TRAP    #1

      	PEA     MSG_OK(PC)		* AFFICHE MESSAGE OK
      	MOVE.W  #9,-(A7)
      	TRAP    #1

      	CLR.W   (A7)			* MESSAGE OK
      	MOVE.L  D6,-(A7)		* TAILLE DU PROGRAMME
      	MOVE.W  #$31,-(A7)		* FONCTION PTERMRES
      	TRAP    #1

* -------------------------------------------------------------------
* MESSAGE D'ERREUR
* -------------------------------------------------------------------

BAD_TOS:
      	MOVE.L  D7,-(A7)		* REPASSE EN USER
      	MOVE.W  #$20,-(A7)
      	TRAP    #1

      	PEA     MSG_ERR(PC) 		* AFFICHE MESSAGE D'ERREUR
      	MOVE.W  #9,-(A7)
      	TRAP    #1

      	CLR.W  (A7)			* QUITTE
      	TRAP    #1

* -------------------------------------------------------------------
* TRAP DETOURNE
* -------------------------------------------------------------------

* ~~~~~~~~~~~~~~~ 
* BIOS (TRAP #13)
* ~~~~~~~~~~~~~~~

TRAP_13:
	BTST 	#5,(A7) 		* APPEL EN SUPERVISEUR ?
      	BEQ.S   USER_BIOS 		* NON -> SUITE
      	LEA     8(A7),A0		* OUI -> SAUTE RETOUR+SR+STACK FRAME
      	BRA.S   SUITE_BIOS 

USER_BIOS:
	MOVE.L 	USP,A0			* A0 = PILE USER

SUITE_BIOS:
	MOVE.W	(A0),D0 		* D0 = N. DE FONCTION BIOS
      	CMP.W	#1,D0 			* BCONSTAT ?
      	BEQ.S	FIX_BCONMAP		* OUI -> SAUT
      	CMP.W  	#2,D0 			* BCONIN ?
      	BEQ.S  	FIX_BCONMAP 		* OUI -> SAUT
      	CMP.W  	#3,D0 			* BCONOUT ?
      	BEQ.S  	FIX_BCONMAP 		* OUI -> SAUT
      	CMP.W  	#8,D0 			* BCOSTAT ?
      	BNE.S  	FIN_BIOS 		* NON -> FIN

FIX_BCONMAP:
	MOVE.W 	2(A0),D0		* D0 = PERIPHERIQUE
      	CMP.W  	#7,D0 			* PERIPHERIQUE 7 (LAN) ?
      	BNE.S  	FIN_BIOS 		* NON -> FIN
      	MOVE.W 	#1,2(A0)		* OUI -> PERIPH. = AUX
FIN_BIOS:
	MOVEA.L	OLD_BIOS(PC),A0		* A0 = ANCIEN VECTEUR BIOS
      	JMP     (A0)			* ON Y SAUTE

* ----------------------------------------------------------------------- *
 	SECTION DATA
 	
      		DC.B    "XBRA_FP1"
OLD_BIOS:	DS.L	1 
NEW_BIOS:	DC.W    $4EF9	; CODE JMP 
      		DC.L    TRAP_13 
MSG_ERR:	DC.B    13,10
      		DC.B	"This version of TOS does not need FPATCH.PRG.",10,13,0
      		EVEN
MSG_OK:		DC.B    13,10
      		DC.B	"FPATCH 1.0 installed",13,10,$00 

* ----------------------------------------------------------------------- *
