et l'instruction:
andi.w #0xF8FF, %sr
me lance une privilege violation.
j'aimerais plutot que cette ligne m'active toutes les auto-ints

c'est moi qui écris n'importe quoi, ou ça devrait passer?

andi.w #0xF8FF, (%sp)[/li][li]2de instruction de ton code TRAP : appeler RTE qui va se contenter de revenir là où tu étais quand tu as appelé le TRAP... mais avec un SR modifié \o/ !!![/li][/ul]Mais bon, c'est barbare, et **il me semble** (à vérifier dans la doc 68k de Rouveyrol) que ton privilege violation vient du fait qu'un ANDI.W sur SR est interdit, même en mode superviseur, alors que le MOVE.W sur SR est autorisé (mais uniquement en superviseur), ce qui donnerait un truc du genre :


squalyl (./4) :
le trap active le mode super automatiquement et c'est le seul moyen d'y parvenir, justement

trap_0: movem.l %d1-%d7/%a0-%a6, -(%sp) /*sauvegarder tous les registres */ move.l %usp, %a0 /*on a seulement le droit de faire usp<->an*/ move.l %a0, -(%sp) /*sauvegarder la pile utilisateur sur la pile systeme*/ ... move.l (%sp)+, %a0 /*restaurer la pile utilisateur*/ move.l %a0, %usp /*on a seulement le droit de faire usp<->an*/ movem.l (%sp)+, %d1-%d7/%a0-%a6 /*restaurer tous les registres*/ rte /*fin du trap zero*/

) va modifier le mode superviseur pendant que les IT sont réactivées effectivement.
...



Martial Demolins (./16) :6 octets, c'est ce que dit la doc.
Ethaniel -> un stack frame de trap prend bien 6 octets, pas 8. en effet, un rte ne vire que 6 octets sur la pile superviseur, pas 8.
Martial Demolins (./16) :
quant à ton move.l a0,-(sp), tu pourrait en faire un pea.l (a0) pour gagner deux cycles (je sais, je chipotte xD)
(le mode d'adressage -(an) ne coûte 2 cycles de plus que s'il est en source, pas s'il est en destination)
...Ethaniel (./12) :
[...] mais a été vérifié sur IMAGSYS [...]
Ethaniel (./18) :À part en ./3 où je ne précise pas les conditions (enfin si, je parle de P3S, mais personne ne connaît, donc forcément, pour savoir que c'est sur IMAGSYS...), je n'ai jamais marqué que ça s'appliquait à tous les 68k...
[...] du moins sur la machine IMAGSYS, qui a un 68040 (d'après ./5), et peut-être d'autres spécificités que j'ai oubliées.
.
ben ouais alors t'as oublié que le 68000 stocke pas le numéro de vecteur

squalyl (./8) :
pen2>oui, évidemment, mais je n'utilise lâârgement pas ça dans mon code, j'appelle proprement des traps, et c'est tout.
Donc, y'a qc qui désactive le mode superviseur entre l'instruction TRAP et le code qui sauve USP.
Vu que le code c'est:trap_0: movem.l %d1-%d7/%a0-%a6, -(%sp) /*sauvegarder tous les registres */ move.l %usp, %a0 /*on a seulement le droit de faire usp<->an*/ move.l %a0, -(%sp) /*sauvegarder la pile utilisateur sur la pile systeme*/ ... move.l (%sp)+, %a0 /*restaurer la pile utilisateur*/ move.l %a0, %usp /*on a seulement le droit de faire usp<->an*/ movem.l (%sp)+, %d1-%d7/%a0-%a6 /*restaurer tous les registres*/ rte /*fin du trap zero*/
je vois pas ce qui désactive le mode superviseur en 2 instructions
je pense que mon bug est ailleurs.
