
;Division par zéro - Gestionnaire; par SM'88

Init_Trap:                ;Installation du gestionnaire
  Move.l 4,A6             ;ExecBase dans A6
  Move.l #Div_End-Div,D0  ;Handler-length jusqu'à D0

  MoveQ  #1,D1             ;MEMF_Public
  Jsr    -198(a6)          ;appel AllocMem
  Move.l  D0,New_Trap      ;Lecture de l'adresse

  Beq.s  Init_End          ;Fin, si erreur
  Move.l D0,A1             ;Adresse dans A1
  Lea    Div,A0            ;CodeStart-Address

  MoveQ  #(Div_End-Div)-1,D0  ;CodeLength-1
Copy_Code:                 ;Copie du gestionnaire
  Move.b (A0)+,(A1)+       ;Copie de l'octet
  DBra   D0,Copy_Code      ;Octet suivant
  Move.l New_Trap,20       ;Nouveau Trap-Vector



Init_End:             ;Adieu
  MoveQ  #0,D0        ;No = 0 !!!
  Divu   D0,D1        ;En avant, gâche ma journée
  rts                 ;Fin

New_Trap:             ;Nouveau Trap-Vector
  dc.l   0            ;1 Long
Div:                  ;Gest. de division par 0
 MoveM.l D0-A6,-(sp) ;Tous les registres (s.u.)
  Move.l  62(sp),A0   ;Lire compt. ordinal à partir de la pile
  Move.w  -2(A0),D0   ;Lire dernière commande
  Move.l  #$ffff,D1   ;Grande valeur pour DIVU

  Btst    #8,D0       ;C'était une instruction DIVU?
  Beq.s   GoOn        ;alors continuer
  Move.l  #$7fff,D1   ;Sinon valeur de  Divs

GoOn:                 ;Transfert des registres de données
  Lsr.w   #7,D0       ;Défilement commande au niveau des bits
  AndI.l  #28,D0      ;Ignorer registre

  Move.l  D1,0(sp,d0.l);Modifier registres et piles
  MoveM.l (sp)+,D0-A6 ;Charger registres modifiés
  Rte                 ;Return from Exception
Div_End:              ;Etiquette: SizeOf

  End
