;/* trap_c.c - Execute me to compile me with SAS C 5.10 LC -b0 -cfistq -v -y -j73 trap_c.c Blink FROM LIB:c.o,trap_c.o,trap_a.o TO trap LIBRARY LIB:LC.lib,LIB:Amiga.lib quit trap_c.c - C module of sample integer divide-by-zero trap */ #include <exec/types.h> #include <exec/tasks.h> #include <clib/exec_protos.h> #include <stdlib.h> #include <stdio.h> #ifdef LATTICE int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */ int chkabort(void) {return(0); } #endif extern ULONG trapa(); /* assembler trap code in trap_a.asm */ APTR oldTrapCode; ULONG countdiv0; void main(int argc, char **argv) { struct Task *thistask; ULONG k,j; thistask = FindTask(NULL); /* Save our task's current trap code pointer */ oldTrapCode = thistask->tc_TrapCode; /* Point task to our assembler trap handler code. Ours will just count */ /* divide-by-zero traps, and pass other traps on to the normal TrapCode */ thistask->tc_TrapCode = (APTR)trapa; countdiv0 = 0L; for(k=0; k<4; k++) /* Let's divide by zero a few times */ { printf("dividing %ld by zero... ",k); j = k/0L; printf("did it\n"); } printf("\nDivide by zero happened %ld times\n",countdiv0); thistask->tc_TrapCode = oldTrapCode; /* Restore old trap code */ } * trap_a.asm - Example trap handling code (leaves D0 intact). Entered * in supervisor mode with the following on the supervisor stack: * 0(sp).l = trap# * 4(sp) Processor dependent exception frame INCLUDE "exec/types.i" INCLUDE "libraries/dos.i" XDEF _trapa XREF _countdiv0 XREF _oldTrapCode CODE _trapa: ; our trap handler entry CMPI.L #5,(SP) ; is this a divide by zero ? BNE.S notdiv0 ; no ADD.L #1,_countdiv0 ; yes, increment our div0 count endtrap: ADDQ #4,SP ; remove exception number from SSP RTE ; return from exception notdiv0: TST.L _oldTrapCode ; is there another trap handler ? BEQ.S endtrap ; no, so we'll exit MOVE.L _oldTrapCode,-(SP) ; yes, go on to old TrapCode RTS ; jumps to old TrapCode END