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 :