;Division by Zero - Handler; by SM'88

Init_Trap:                ;Install handler
  Move.l 4,A6             ;ExecBase to A6
  Move.l #Div_End-Div,D0  ;Handler-Length to D0

  MoveQ  #1,D1             ;MEMF_Public
  Jsr    -198(a6)          ;call AllocMem
  Move.l  D0,New_Trap      ;get  address

  Beq.s  Init_End          ;End, when error
  Move.l D0,A1             ;Address to A1
  Lea    Div,A0            ;CodeStart-Address

  MoveQ  #(Div_End-Div)-1,D0  ;CodeLength-1
Copy_Code:                 ;Handler copy
  Move.b (A0)+,(A1)+       ;Byte copy
  DBra   D0,Copy_Code      ;Next Byte
  Move.l New_Trap,20       ;New Trap-Vector



Init_End:             ;Adieu
  MoveQ  #0,D0        ;No = 0 !!!
  Divu   D0,D1        ;Go Ahead, Make My Day
  rts                 ;End

New_Trap:             ;New Trap-Vector
  dc.l   0            ;1 LongWord

Div:                  ;DivisionByZeroHandler
  MoveM.l D0-A6,-(sp) ;All Register (s.u.)
  Move.l  62(sp),A0   ;get PC from Stack
  Move.w  -2(A0),D0   ;get last command
  Move.l  #$ffff,D1   ;large value for Divu

  Btst    #8,D0       ;Was it Divu-instruction?
  Beq.s   GoOn        ;then continue
  Move.l  #$7fff,D1   ;Else Divs-Value

GoOn:                 ;Ermitteln des Datenregisters
  Lsr.w   #7,D0       ;Befehl bitweise scrollen
  AndI.l  #28,D0      ;Register ausklammern

  Move.l  D1,0(sp,d0.l);Register and Stack „ndern
  MoveM.l (sp)+,D0-A6 ;Ge„nderte Register laden
  Rte                 ;Return from Exception
Div_End:              ;Label: SizeOf

  End
