/// CALL UEXIT(IVAL) / / TRAPS CALLS TO 'EXIT' AND INSTEAD RE-ROUTES THEM / TO PLACES OF THE CALLERS DESIRE. / / CALL UEXIT(0) / DISBALE USER EXIT TRAP. / / CALL UEXIT(1) / RETURN TO LAST 'UEXIT' CALL WHEN 'EXIT' CALLED. / FOR EXAMPLE: / ITRAP=.FALSE. / CALL UEXIT(1) / IF (ITRAP) GOTO 100 / ITRAP=.TRUE. @CONTINUE INIT / .ETC. / C RESTART / 100 CONTINUE / / CALL UEXIT(2) / JMP TO 'MAIN' ENTRY POINT WHEN 'EXIT' CALLED. / ENTRY UEXIT DUMMY VECTC DUMMY VECTA DUMMY PARA DUMMY VECTD OPDEF CDF0 6201 OPDEF INC 2000 OPDEF KCF 6032 VECTD, CDF0;0507 VECTC, CDF0;0 VECTA, CDF0;0 PARA, 0;0 EXITC, 0 EXITA, 0 RETRNA, 0 CALL 1,UEXIT TRAP, ARG EXIT /// EXIT - TRAPPED EXIT CALLS COME HERE AND GET RE-ROUTED / EXIT, BLOCK 2 KCF /CLEAR ANY CONSOLE FLAG FROM ^C RETRNC, JMP I RETRNA /BECOMES CDF CIF UEXIT, BLOCK 2 TAD I UEXIT DCA PARA INC UEXIT# TAD I UEXIT DCA PARA# INC UEXIT# TAD I PARA CIA IAC SNA JMP UEX40 /IF 1, USE 'UEXIT' RETURN ADDRESS IAC SNA JMP UEX30 /IF 2, USE 'MAIN' ENTRY POINT CLA /IF ANYTHING ELSE, DISABLE TRAP JMS UEXFVE /FIND 'EXIT' VECTOR ADDRESS CALL 0,EXIT TAD EXITC SNA JMP UEX90 /NOTHING TO RESTORE DCA I VECTC DCA EXITC TAD EXITA DCA I VECTA DCA EXITA JMP UEX90 UEX30, JMS UEXFVE /FIND 'MAIN' VECTOR ENTRY CALL 0,MAIN TAD I VECTC TAD (2 /CDF BECOMES CDF CIF DCA RETRNC TAD I VECTA DCA RETRNA JMP UEX50 UEX40, TAD UEXIT TAD (2 /CDF BECOMES CDF CIF DCA RETRNC TAD UEXIT# DCA RETRNA UEX50, JMS UEXFVE /FIND 'EXIT' VECTOR ENTRY CALL 0,EXIT TAD EXITC SZA CLA JMP UEX90 /TRAP ALREADY INSTALLED TAD I VECTC /SAVE CURRENT CONTENTS DCA EXITC TAD I VECTA DCA EXITA TAD TRAP /SUBSTITUTE FAKE 'EXIT' VECTOR DCA I VECTC TAD TRAP# DCA I VECTA UEX90, RETRN UEXIT /// UEXFVE - FIND VECTOR ADDRESS / CALL + 1 AND 2 ARE SAMPLE SABR CALLS / UEXFVE, 0 INC UEXFVE TAD I UEXFVE INC UEXFVE TAD (200 /200 = ADDR OF CDF TABLE DCA VECTC# TAD VECTC# TAD I VECTD /ADD ADDR OF DISPLACEMENT BETWEEN DCA VECTA# / CDF AND ADDR TABLES FOOL1, JMP I UEXFVE END