1

...Autrement dit, ne pas planter le bureau en même temps que son programme tout buggué !

C'est plus facile à mettre en œuvre en assembleur, parce qu'à un moment, il faut un pointeur sur une routine. On doit pouvoir s'en sortir en C pur avec un pointeur de fonction sans paramètre. Pour les autres langages, je donne mon clavier au chat !

Le contexte

On écrit un programme qui change quelques registres matériels et quelques interruptions pour faire son affaire : palette, gestion de la souris/clavier, changement de résolution, etc...

Bien entendu, à la fin, on remet tout en place... Sauf qu'un bug mal fagotté trouble la fête, et laisse le bureau en carafe également. Pas d'autre choix que le reset !

Le vecteur logique GEMDOS numéro 258 à la rescousse !

Il faut savoir que quand le CPU n'arrive pas à executer une instruction (erreur de bus, etc...), il saute vers la routine réagissant à cette erreur (généralement afficher des bombes) et ensuite saute vers la "routine logique GEMDOS numéro 258" alias "etv_term". Le CPU se renseigne sur le pointeur de chaque routine dans la zone mémoire des vecteurs et variables systèmes.

En installant notre routine de nettoyage comme routine 258, on s'assure de pouvoir remettre le système en ordre de marche pour le retour au bureau GEM.

On installe la routine à l'aide de l'appel bios numéro 5 "setexc".

Exemple type de code :

; ================================================================================================================ ; Remainder : Trap macros (bios, xbios, gemdos, gem) ; ---------------------------------------------------------------------------------------------------------------- ___trap macro ;1 - trap to call, e.g. 14 (gemdos) ;2 - opcode > 0 ;3 - stack correction offset >= 0 move.w #\2,-(sp) trap #\1 ifne \3 iflt \3-8 addq.l #\3,sp else lea \3(sp),sp endif endif endm ___bios macro ;1 - opcode > 0 ;2 - stack correction offset >0 ___trap 13,\1,\2 endm ; ; ================================================================================================================ ; Macro to setup the etv_term routine ; ---------------------------------------------------------------------------------------------------------------- SetupAbnormalTerm macro move.l #HastilyTerminateHandler,-(sp) move.w #258,-(sp) ___bios 5,8 endm ; ================================================================================================================ ; Start of program ; ---------------------------------------------------------------------------------------------------------------- ; initialize ; ... ; -- prepare to quit abruptly SetupAbnormalTerm ; proceed to the app bsr.w BodyOfApp EndOfApp: ; cleanup the system ; call Pterm (gemdos #0) HastilyTerminateHandler: ; restore all ; rts BodyOfApp: ; do stuff, maybe bugged ; rts

Références :