MODULE ; CATCH.ACT ; copyright (c) 1984 ; by Action Computer Services ; All Rights Reserved ; This module provides two PROCs ; (Catch and Throw) which can be used ; for error trapping (and flow ; control, yeck!) in ACTION!. To ; use them, you must call the Catch ; PROC to indicate where you want ; the program to continue when you ; call Throw. When throw is called, ; execution will continue following ; the last call to Catch with the ; same index as the call to Throw. ; Calling Catch is similar (but not ; identical) to TRAP in BASIC. It ; differs in that the actual trapping ; is generated by the user (by ; calling Throw) and that you can ; have multiple Catch'ers active at ; one time. Also, you cannot Throw ; to a Catcher that is no longer ; active (the PROC/FUNC containing ; it has RETURN to it's caller). The ; Throw procedure tries to check for ; this error, but it is possible to ; fool it into thinking it's OK. If ; you want to solve this problem, you ; can set 'c_t_sp(index)' to zero ; before you return from the PROC ; that contained the Catch(index). ; If index is greater than 24 or ; if there is no matching Catch index ; for the Throw, then Error will be ; called with a value of CTERR ; (defined below to be 71). If you ; setup your own Error procedure and ; use Catch and Throw, your error ; procedure should handle this error ; as well or your program will most ; likely "go off the deep end". DEFINE CTERR = "71" BYTE ARRAY c_t_sp(25)=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] BYTE ARRAY c_t_hi(25), c_t_lo(25) PROC Catch(BYTE index) DEFINE TSX="$BA", TXA="$8A", LDYA="$AC", STAY="$99", PLA="$68", LDAY="$B9", PHA="$48" IF index>=25 THEN Error(CTERR,0,CTERR) FI [ LDYA index PLA STAY c_t_hi PLA STAY c_t_lo TSX TXA STAY c_t_sp LDAY c_t_lo PHA LDAY c_t_hi PHA ] RETURN PROC Throw(BYTE index) DEFINE TXS="$9A", PHA="$48", LDYA="$AC", STX="$86", TSX="$BA", TAX="$AA", LDAY="$B9" BYTE sp=$A2 ; get current stack pointer [ TSX : STX sp ] IF index>=25 OR sp+2>c_t_sp(index) THEN Error(CTERR,0,CTERR) FI [ LDYA index LDAY c_t_sp TAX TXS LDAY c_t_lo PHA LDAY c_t_hi PHA ] RETURN MODULE ; just in case