home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / dev / e / amigae / rkrmsrc / exec_library / tasks / trap.e < prev   
Text File  |  1995-03-31  |  1KB  |  44 lines

  1. -> trap.e - E example of sample integer divide-by-zero trap
  2.  
  3. MODULE 'exec/tasks'
  4.  
  5. DEF oldTrapCode, countdiv0
  6.  
  7. PROC main()
  8.   DEF thistask:PTR TO tc, k, j, z
  9.  
  10.   thistask:=FindTask(NIL)
  11.  
  12.   -> Save our task's current trap code pointer
  13.   oldTrapCode:=thistask.trapcode
  14.  
  15.   -> Point task to our assembler trap handler code.  Ours will just count
  16.   -> divide-by-zero traps, and pass other traps on to the normal TrapCode.
  17.   thistask.trapcode:={trapa}
  18.  
  19.   countdiv0:=0
  20.  
  21.   z:=0  -> E-Note: the E compiler will not allow an explicit "k/0"!
  22.   FOR k:=0 TO 3  -> Let's divide by zero a few times
  23.     WriteF('dividing \d by zero... ', k)
  24.     j:=k/z
  25.     WriteF('did it\n')
  26.   ENDFOR
  27.   WriteF('\nDivide by zero happened \d times\n', countdiv0)
  28.  
  29.   thistask.trapcode:=oldTrapCode  -> Restore old trap code
  30. ENDPROC
  31.  
  32. trapa:                       -> Our trap handler entry
  33.   CMPI.L #5, (A7)            -> Is this a divide by zero ?
  34.   BNE.S notdiv0              -> No
  35.   ADD.L #1, countdiv0        -> Yes, increment our div0 count
  36. endtrap:
  37.   ADDQ #4, A7                -> Remove exception number from SSP
  38.   RTE                        -> Return from exception
  39. notdiv0:
  40.   TST.L oldTrapCode          -> Is there another trap handler ?
  41.   BEQ.S endtrap              -> No, so we'll exit
  42.   MOVE.L oldTrapCode, -(A7)  -> Yes, go on to old TrapCode
  43.   RTS                        -> Jumps to old TrapCode
  44.