Il existe principalement deux solutions. Une des plus connues est de mettre le drapeau ST.15 à 0 (ST=0.15). Dans ce cas, la prochaine interruption se soldera par un RTN, ce qui empèchera au Saturn de sortir du mode interrompu, il ne pourra donc plus y avoir d'autres interruptions. Pour les réautoriser, il faudra remettre ST.15 (ST=1.15) et les réinitialiser avec RSI (dans certains cas, il faut aussi utiliser RTI).
Mais ce n'est pas une méthode très efficace car il reste une
interruption possible. Même si dans la majorité des cas ce n'est
pas génant qu'il y ait encore une interruption, le problème est
aussi que cela utilise un étage de RSTK. C'est pourquoi il existe
deux routines, respectivement pour les inhiber et les réstaurer,
sans qu'il y ait la moindre interruption possible : INTOFF2
et INTON2.
Voici donc comment marche INTOFF2 (DisableIntr) (merci à Jean-Yves Avenard pour son post sur zoy.org). On commence naturellement par mettre le flag à 0. Il faut maintenant supprimer cette dernière interruption possible. Pour ce faire, on va ecrire dans le controlleur de carte pour forcer une interruption (si on met à 1 le bit 0 de 0010E (bit SWINT de CARDCTL) il se produit une interruption). Dans ce cas, on saute sur le gestionnaire d'interruption, on met à un le bit 14 qui signale si une interruption à eu lieu et on resort avec un RTN (le Saturn est toujours en mode interrompu). Et voila, il ne peut plus du tout y aoir une interruption.
Maintenant, que fait INTON2 (AllowIntr). On commence pas INTON dans le cas où on aurrait INTOFF au paravant, ce qui autorise les interruptions masquables. Ensuite, il regarde si une interruption est en attente de traitement, et fait RSI (ReSet Interrupt) dans ce cas, ce qui force le Saturn à créer une interruption si des touches activées par le masque OUT sont à un quand on sortira du mode interrompu. On fait enfin RTI pour sortir du mode interrompu et retourner au programme. Les interruptions peuvent donc reprendre sans problème.
Voici le code de INTON2 et INTOFF2 :
% INTON2
ST=1.15
INTON
GOC AI_CS % Ca se complique un peu
mais c'est dans le but de preserver la Carry
?ST=0.14 GOYES rticc
RSI
*rticc
?ST=0.15 % Ce test ne sert qu'a nettoyer la
Carry
GOYES rti
GONC rti
*AI_CS
?ST=0.14 GOYES rti
RSI
?ST=1.15 % Charge la Carry
GOYES rit
rti
ST=0.14
RTI
% INTOFF2
ST=0.15
CD0EX RSTK=C
D0=(5) CARDCTL
C=DAT0.B CBIT=1.0
DAT0=C.1
CBIT=0.0 DAT0=C.1
C=RSTK D0=C
INTOFF
RTNCC
Et voila, vous savez détourner les interruptions, vous savez les inhiber partiellement ou totalement. Il ne reste plus qu'a l'appliquer...