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 >
Wrap
Text File
|
1988-07-25
|
4KB
|
170 lines
nam interc_traps
ttl Error trap handler installation for signal()
use /dd/defs/defsfile
*******************************************************************
* Edition History
*
* # date Comments by
* -- -------- ----------------------------------------------- ---
* 01 22-07-88 rc
*
psect interc_traps,0,0,0,0,0
*************************
*
* C interface :
*
* int intercept_traps(trap_table,flag_table)
* int (* trap_table[9])();
* int flag_table[9];
*
* Assembler interface :
*
* Input :
* (d0) address of trap table (9 entries)
* (d1) address of flag table (9 entries)
*
* Output :
* (d0) 0 if no error occurred, else error code
*
* Action :
* Installs trap handlers in trap_table, using
* flag_table as scratch area to avoid recursive traps.
*
vsect
Tables
ds.l 2 user exception handler & flag table address
ends
intercept_traps:
move.l d0,Tables(a6) save trap_table
move.l d1,Tables+4(a6) save flag_table
move.l #0,a0 use current stack in trap handler
lea InitTable(pc),a1 get table address
os9 F$STrap install trap handlers
bcs error
clr.l d1
error
move.l d1,d0 return error code
rts
SIG_DFL equ 0 default behaviour (exit with error)
SIG_IGN equ 1 ignore signal
BusErrOffs equ 0
AddErrOffs equ 1
IllInsOffs equ 2
ZeroDivOffs equ 3
CHKOffs equ 4
TRAPVOffs equ 5
PrivOffs equ 6
E1010Offs equ 7
E1111Offs equ 8
BusError
move.l #-BusErrOffs-1,d0 signal number
move.l #BusErrOffs*4,d1 offset into tables
move.l #E$BusErr,d2 error number
bra call
AddressError
move.l #-AddErrOffs-1,d0 signal number
move.l #AddErrOffs*4,d1 offset into tables
move.l #E$AdrErr,d2 error number
bra call
IllegalInstruction
move.l #-IllInsOffs-1,d0 signal number
move.l #IllInsOffs*4,d1 offset into tables
move.l #E$IllIns,d2 error number
bra call
ZeroDivision
move.l #-ZeroDivOffs-1,d0 signal number
move.l #ZeroDivOffs*4,d1 offset into tables
move.l #E$ZerDiv,d2 error number
bra call
RangeError
move.l #-CHKOffs-1,d0 signal number
move.l #CHKOffs*4,d1 offset into tables
move.l #E$Chk,d2 error number
bra call
OverflowError
move.l #-TRAPVOffs-1,d0 signal number
move.l #TRAPVOffs*4,d1 offset into tables
move.l #E$TrapV,d2 error number
bra call
PrivilegeError
move.l #-PrivOffs-1,d0 signal number
move.l #PrivOffs*4,d1 offset into tables
move.l #E$Violat,d2 error number
bra call
Emulator1010
move.l #-E1010Offs-1,d0 signal number
move.l #E1010Offs*4,d1 offset into tables
move.l #E$1010,d2 error number
bra call
Emulator1111
move.l #-E1111Offs-1,d0 signal number
move.l #E1111Offs*4,d1 offset into tables
move.l #E$1111,d2 error number
bra call
call
move.l Tables+4(a6),a0 get address of flag table
tst.l 0(a0,d1) check flag
bne continue ignore trap if set
move.l Tables(a6),a1 get address of jump table
move.l 0(a1,d1),a1 get user trap routine
cmpa.l #SIG_DFL,a1
beq error_exit SIG_DFL behaviour (exit with error)
cmpa.l #SIG_IGN,a1
beq continue SIG_IGN behaviour (ignore)
move.l #1,0(a0,d1) set flag
movem.l d1/a5,-(sp) save table offset/register address
jsr (a1)
movem.l (sp)+,d1/a5 restore table offset/register address
move.l Tables+4(a6),a0 get address of flag table
clr.l 0(a0,d1) clear flag
bra continue
error_exit
move.l d2,d0
bsr exit exit()
continue
movem.l (a5),d0-d7/a0-a7 restore registers
subq.l #6,sp adjust sp
rtr restore cc and return to process
align
InitTable
dc.w T_BusErr,BusError-*-4
dc.w T_AddErr,AddressError-*-4
dc.w T_IllIns,IllegalInstruction-*-4
dc.w T_ZerDiv,ZeroDivision-*-4
dc.w T_CHK,RangeError-*-4
dc.w T_TRAPV,OverflowError-*-4
dc.w T_Priv,PrivilegeError-*-4
dc.w T_1010,Emulator1010-*-4
dc.w T_1111,Emulator1111-*-4
dc.w -1 End of table
ends