home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum7.lzh / RICO / C / LIBSOURCE / SIGNAL / interctraps.a next >
Text File  |  1988-07-25  |  4KB  |  170 lines

  1.  
  2.         nam  interc_traps
  3.         ttl  Error trap handler installation for signal()
  4.  
  5.         use    /dd/defs/defsfile
  6.  
  7. *******************************************************************
  8. * Edition History                                                 
  9. *                                                                 
  10. * #   date      Comments                                      by  
  11. * -- -------- ----------------------------------------------- --- 
  12. * 01 22-07-88                                                 rc
  13. *
  14.  
  15.         psect interc_traps,0,0,0,0,0
  16.  
  17. *************************
  18. *
  19. *    C interface :
  20. *
  21. *    int intercept_traps(trap_table,flag_table)
  22. *    int (* trap_table[9])();
  23. *    int flag_table[9];
  24. *
  25. *    Assembler interface :
  26. *
  27. *    Input :
  28. *    (d0)    address of trap table (9 entries)
  29. *    (d1)    address of flag table (9 entries)
  30. *
  31. *    Output :
  32. *    (d0)    0 if no error occurred, else error code
  33. *
  34. *    Action :
  35. *            Installs trap handlers in trap_table, using
  36. *            flag_table as scratch area to avoid recursive traps.
  37. *
  38.  
  39.     vsect
  40.  
  41. Tables
  42.     ds.l    2                        user exception handler & flag table address
  43.  
  44.     ends
  45.  
  46.  
  47. intercept_traps:
  48.     move.l    d0,Tables(a6)            save trap_table
  49.     move.l    d1,Tables+4(a6)            save flag_table
  50.     move.l    #0,a0                    use current stack in trap handler
  51.     lea        InitTable(pc),a1        get table address
  52.     os9        F$STrap                    install trap handlers
  53.     bcs        error
  54.     clr.l    d1
  55. error
  56.     move.l    d1,d0                    return error code
  57.     rts
  58.  
  59.  
  60. SIG_DFL        equ    0                    default behaviour (exit with error)
  61. SIG_IGN        equ    1                    ignore signal
  62.  
  63. BusErrOffs    equ    0
  64. AddErrOffs    equ    1
  65. IllInsOffs    equ    2
  66. ZeroDivOffs    equ    3
  67. CHKOffs        equ    4
  68. TRAPVOffs    equ    5
  69. PrivOffs    equ    6
  70. E1010Offs    equ    7
  71. E1111Offs    equ    8
  72.  
  73.  
  74. BusError
  75.     move.l    #-BusErrOffs-1,d0        signal number
  76.     move.l    #BusErrOffs*4,d1        offset into tables
  77.     move.l    #E$BusErr,d2            error number
  78.     bra        call
  79.  
  80. AddressError
  81.     move.l    #-AddErrOffs-1,d0        signal number
  82.     move.l    #AddErrOffs*4,d1        offset into tables
  83.     move.l    #E$AdrErr,d2            error number
  84.     bra        call
  85.  
  86. IllegalInstruction
  87.     move.l    #-IllInsOffs-1,d0        signal number
  88.     move.l    #IllInsOffs*4,d1        offset into tables
  89.     move.l    #E$IllIns,d2            error number
  90.     bra        call
  91.  
  92. ZeroDivision
  93.     move.l    #-ZeroDivOffs-1,d0        signal number
  94.     move.l    #ZeroDivOffs*4,d1        offset into tables
  95.     move.l    #E$ZerDiv,d2            error number
  96.     bra        call
  97.  
  98. RangeError
  99.     move.l    #-CHKOffs-1,d0            signal number
  100.     move.l    #CHKOffs*4,d1            offset into tables
  101.     move.l    #E$Chk,d2                error number
  102.     bra        call
  103.  
  104. OverflowError
  105.     move.l    #-TRAPVOffs-1,d0        signal number
  106.     move.l    #TRAPVOffs*4,d1            offset into tables
  107.     move.l    #E$TrapV,d2                error number
  108.     bra        call
  109.  
  110. PrivilegeError
  111.     move.l    #-PrivOffs-1,d0            signal number
  112.     move.l    #PrivOffs*4,d1            offset into tables
  113.     move.l    #E$Violat,d2            error number
  114.     bra        call
  115.  
  116. Emulator1010
  117.     move.l    #-E1010Offs-1,d0        signal number
  118.     move.l    #E1010Offs*4,d1            offset into tables
  119.     move.l    #E$1010,d2                error number
  120.     bra        call
  121.  
  122. Emulator1111
  123.     move.l    #-E1111Offs-1,d0        signal number
  124.     move.l    #E1111Offs*4,d1            offset into tables
  125.     move.l    #E$1111,d2                error number
  126.     bra        call
  127.  
  128.  
  129. call
  130.     move.l    Tables+4(a6),a0            get address of flag table
  131.     tst.l    0(a0,d1)                check flag
  132.     bne        continue                ignore trap if set
  133.     move.l    Tables(a6),a1            get address of jump table
  134.     move.l    0(a1,d1),a1                get user trap routine
  135.     cmpa.l    #SIG_DFL,a1
  136.     beq        error_exit                SIG_DFL behaviour (exit with error)
  137.     cmpa.l    #SIG_IGN,a1
  138.     beq        continue                SIG_IGN behaviour (ignore)
  139.     move.l    #1,0(a0,d1)                set flag
  140.     movem.l    d1/a5,-(sp)                save table offset/register address
  141.     jsr        (a1)
  142.     movem.l    (sp)+,d1/a5                restore table offset/register address
  143.     move.l    Tables+4(a6),a0            get address of flag table
  144.     clr.l    0(a0,d1)                clear flag
  145.     bra        continue
  146. error_exit
  147.     move.l    d2,d0
  148.     bsr        exit                    exit()
  149. continue
  150.     movem.l    (a5),d0-d7/a0-a7        restore registers
  151.     subq.l    #6,sp                    adjust sp
  152.     rtr                                restore cc and return to process
  153.  
  154.  
  155.     align
  156. InitTable
  157.      dc.w    T_BusErr,BusError-*-4
  158.     dc.w    T_AddErr,AddressError-*-4
  159.     dc.w    T_IllIns,IllegalInstruction-*-4
  160.     dc.w    T_ZerDiv,ZeroDivision-*-4
  161.     dc.w    T_CHK,RangeError-*-4
  162.     dc.w    T_TRAPV,OverflowError-*-4
  163.     dc.w    T_Priv,PrivilegeError-*-4
  164.     dc.w    T_1010,Emulator1010-*-4
  165.     dc.w    T_1111,Emulator1111-*-4
  166.     dc.w    -1    End of table
  167.  
  168.  
  169.         ends
  170.