

* ------------------------------------------------- *
*						    *
*						    *
*	Fragments du code du H-Checker.		    *
*						    *
*           © Thibaut Maquet 6/92		    *
*						    *
*						    *	
* ------------------------------------------------- *



* --------------------------------------------------*
*						    *
*	             Structures			    *
*						    *
* --------------------------------------------------*
		

;
; Routine pour ouvrir la dos.library et obtenir le conhandle 
;

Check_debut:
	movem.l a0-a6/d0-d7,-(a7)
	bsr OpenDosLib
	bsr Obt_ConHandle

;
; Routine destinée à detecter l'offset de la ROM
;

Check_offset:
	move.l $4.w,a6		;Exec base
	move.l 10(a6),d0	;Nom de la library
	clr d0			;effacer bits superflux
	lea Rom_Offset,a0	;sauver offset de la ROM
	move.l d0,(a0)		;ex: kick1.3=fc0000

;
; Routine destinée à verifier les residents
;

Tester_resident:

	moveq #0,d0		;vider d0
	add.l 42(a6),d0		;ColdCapture
	add.l 46(a6),d0		;CoolCapture
	add.l 50(a6),d0		;WarmCapture
	add.l 546(a6),d0	;KickMemPtr
	add.l 550(a6),d0	;KickTagPtr
	add.l 554(a6),d0	;KickChecksum
	tst.l d0		;d0=0 ?
	beq.s Tester_trackdisk  ;non
	bsr residents_devies	;non,alors les residents sont déviés	

;
; Routine destinée à verifier le trackdisk.device
;

Tester_trackdisk:
	bsr OpenTrackDisk	;chercher le point d'entree du device
	lea Trackbase,a0	;pointeur sur la base du device
	move.l (a0),a1		;en a1
	lea Rom_offset,a0	;Chercher le Rom offset
	move.l (a0),d0		;
        move.l -34(a1),d1	;AbortIO
	bsr Test_offset		;tester
        move.l -28(a1),d1	;BeginIO
	bsr Test_offset		;tester
        move.l -16(a1),d1	;ExpungeIO
	bsr Test_offset		;tester
        move.l -10(a1),d1	;CloseIO
	bsr Test_offset		;tester
        move.l -4(a1),d1	;OpenIO
	bsr Test_offset		;tester

;
; Fin du programme
;

Check_fin:
	movem.l (a7)+,a0-a6/d0-d7
	rts


* --------------------------------------------------*
*						    *
*	        Sous programmes  		    *
*						    *
* --------------------------------------------------*
		

;
; Ouvrir la dos.library
;

OpenDosLib:
	move.l $4.w,a6		;ExecBase
	moveq #0,d0		;version
	lea DosLib,a1		;"dos.library"
	jsr -408(a6)		;OldOpenLib
	lea DosBase,a0		;sauver dosbase
	move.l d0,(a0)		;
	rts			;

;
; Ouvrir l'ecran
;

Obt_ConHandle:
	move.l Dosbase,a6	;Dosbase
	jsr -60(a6)		;Output
	lea ConHandle,a0	;Sauver le handle de l'ecran
	move.l d0,(a0)		;
	rts			;

;
; Ouvrir le trackdisk.device
;

OpenTrackDisk:
	move.l $4.w,a6		;ExecBase
	lea TrackDisk(pc),a1	;"trackdisk.device"
        lea 350(a6),a0		;liste des devices
        jsr -276(a6)		;FindName
	lea TrackBase,a0	;sauver TrackBase
	move.l d0,(a0)		;
        rts			;
	
;
;
; ecrire "les residents sont deviés."
;

residents_devies:
	move.l #txt1,d2		;debut du texte
	move.l #txt2-txt1,d3	;taille du texte
	bsr ecrire		;ecrire
	bsr effectuer_reset	;
	rts			;

;
; ecrire "le trackdisk.device est devié."
;

trackdisk_devie:
	move.l #txt3,d2		;debut du texte
	move.l #txt4-txt3,d3	;taille du texte
	bsr ecrire		;ecrire
	bsr effectuer_reset	;
	rts			;

;
; ecrire "Bouton gauche pour un reset."
;

ecrire_reset:	
	move.l #txt5,d2		;debut du texte
	move.l #txt6-txt5,d3	;taille du texte
	bsr ecrire		;ecrire
	rts			;

;
; Sous-routine d'ecriture d'un message
;

Ecrire:
	move.l Dosbase,a6	;Dosbase
	move.l ConHandle,d1	;ecran
	jsr -48(a6)		;ecrire
	rts			;

;
; Tester si un vecteur est en ROM
;

Test_offset:
	cmpi.l d0,d1		;vecteur plus petit que offset ROM
	blt trackdisk_devie	;oui,don devié
	rts

;
; Doit-on oui ou non effectuer un reset ?
;

effectuer_reset:
	bsr ecrire_reset	;ecrire alternative
effectuer_reset1:
        btst #6,$bfe001		;bouton gauche
        beq faire_reset		;oui
        btst #10,$dff016	;bouton droit
        beq.s effectuer_reset2 	;oui
        bra.s effectuer_reset1 	;boucler
effectuer_reset2:
	rts			;pas de reset,on quitte

;
; Routine reset
;

Faire_reset:
        move #$4000,$dff09a	;interdire interruptions
        add.b #$01,294(a6)	;incrementer IDNestCnt
	move.l $4.w,a6		;ExecBase
        clr.l 550(a6)		;effacer KicktagPtr
        clr.l 546(a6)		;effacer KickMemPtr
        clr.l 46(a6)		;effacer CoolCapture
	clr.l 42(a6)		;effacer ColdCapture
        clr.l -100(a6)		;effacer InitResident (Cf SADDAM !!)
	move.l #"BOUM",50(a6)	;WarmCapture different de 0
	cmpi.w #$24,20(a6)	;Kick2.0
	blt.s PasROM20		;non
	jmp -726(a6)		;oui Reset 2.0
PasROM20:
	lea SuiteReset(pc),a5	;Pgm superviseur
	jsr -30(a6)		;Supervisor
SuiteReset:
	lea $0,a0		;pointe sur $0
	suba.l -20(a0),a0	;-20=$ffc0
	move.l 4(a0),a0		;$fc00f2
	subq.l #2,a0		;debut de la routine reset
	reset			;instruction pour initialiser les 
	jmp (a0)		;peripheriques et saut

* --------------------------------------------------*
*						    *
*	             Données			    *
*						    *
* --------------------------------------------------*
		

Rom_Offset:
	dc.l 0
TrackBase:
	dc.l 0
ConHandle:
	dc.l 0
DosBase:
	dc.l 0
DosLib:
	dc.b "dos.library",0
TrackDisk:
	dc.b "trackdisk.device",0
txt1:
	dc.b "Les residents sont déviés.",10,0
txt2:
txt3:
	dc.b "Le trackdisk.device est dévié.",10,0
txt4:
txt5:
	dc.b "Bouton gauche pour un reset.",10,0
txt6:



