31000 TRAP 31046›31002 REM ›31004 REM BASIC TRACE UTILITY›31006 REM ALAN FILIPSKI 1982›31008 REM ›31010 REM FIND START OF STMNT TABLE›31012 DBGST=PEEK(136)+256*PEEK(137)›31014 REM SET ERR IN EACH STMNT›31016 GOSUB 31152›31018 ? " ":? "BASIC TRACE UTILITY":? " "›31020 ? "ENTER LINE NUMBER AT WHICH"›31022 ? "EXECUTION IS TO START"›31024 ? "(FIRST LINE IN PROG IS ";PEEK(DBGST)+256*PEEK(DBGST+1);")"›31026 INPUT DBGSTART›31028 REM CLR ARRAYS IF STARTING AT FIRST STATEMENT›31030 IF DBGSTART<>PEEK(DBGST)+256*PEEK(DBGST+1) THEN 31038›31032 CLR :DBGST=PEEK(136)+256*PEEK(137)›31034 REM RESTORE DBGSTART›31036 DBGSTART=PEEK(DBGST)+256*PEEK(DBGST+1)›31038 ? "HOW MANY LINES TO TRACE ":INPUT DBGTC›31040 IF DBGTC<=0 THEN 31064›31042 GOTO DBGSTART›31044 REM TRAP HERE AT EACH ERROR ENCOUNTERED›31046 DBGST=PEEK(136)+256*PEEK(137)›31048 IF PEEK(195)=17 THEN 31054›31050 REM UNEXPECTED ERROR TYPE›31052 ? "ERR TYPE ";PEEK(195);" AT LINE ";PEEK(186)+256*PEEK(187):GOTO 31064›31054 IF DBGTC>0 THEN 31072›31056 ? "HOW MANY MORE ";›31058 INPUT DBGTC›31060 IF DBGTC>0 THEN 31072›31062 REM TIME TO QUIT. REMOVE ERRS›31064 GOSUB 31212›31066 ? "TRACE ABORTED"›31068 STOP ›31070 REM REINTRODUCE ERR INTO CLEARED "FOR" OR "GOSUB"›31072 IF DBGSAV1=0 THEN 31086›31074 DBGSAV1=DBGSAV1+DBGST:IF PEEK(DBGSAV1+4)=55 THEN 31086›31076 DBGEOL=DBGSAV1+PEEK(DBGSAV1+2)-1›31078 DBGCOM=DBGSAV1+4›31080 POKE DBGEOL,PEEK(DBGEOL)+PEEK(DBGCOM)›31082 POKE DBGCOM,55›31084 REM REINTRODUCE ERR INTO LAST STATEMENT EXECUTED›31086 DBGSAV2=DBGSAV2+DBGST:IF PEEK(DBGSAV2+4)=55 THEN 31098›31088 DBGEOL=DBGSAV2+PEEK(DBGSAV2+2)-1›31090 DBGCOM=DBGSAV2+4›31092 POKE DBGEOL,PEEK(DBGEOL)+PEEK(DBGCOM)›31094 POKE DBGCOM,55›31096 REM CLEAR ERR FROM "FOR" OR "GOSUB" ON TOP OF RUNSTK›31098 DBGSAV1=0›31100 IF PEEK(142)=PEEK(144) AND PEEK(143)=PEEK(145) THEN 31114›31102 DBGTOP=PEEK(144)+256*PEEK(145)›31104 DBGLN1=PEEK(DBGTOP-3)›31106 DBGLN2=PEEK(DBGTOP-2)›31108 GOSUB 31176›31110 DBGSAV1=DBGPTR-DBGST›31112 REM FIND STATEMENT WHICH TRIGGERED TRAP AND CLEAR ERR›31114 DBGLN1=PEEK(186)›31116 DBGLN2=PEEK(187)›31118 GOSUB 31176›31120 DBGSAV2=DBGPTR-DBGST›31122 REM ***************************›31124 REM INSERT USER PRINT STATEMENTS HERE›31126 REM ***************************›31128 REM LIST TRAPPED STMNT›31130 LIST PEEK(DBGPTR)+256*PEEK(DBGPTR+1)›31132 TRAP 40000:TRAP 31046›31134 DBGTC=DBGTC-1›31136 REM IF STMNT IS END OR STOP, CLEAR ALL STATEMENTS›31138 IF PEEK(DBGPTR+4)=21 OR PEEK(DBGPTR+4)=38 THEN GOSUB 31212›31140 REM EXECUTE STATEMENT›31142 GO TO PEEK(DBGPTR)+PEEK(DBGPTR+1)*256›31144 REM ›31146 REM SUB TO SET ERRS›31148 REM SET COMMAND TOKEN IN ALL USER STATEMENTS (EXCEPT DATA STATEMENTS) TO 55 (=ERROR)›31150 REM SAVE ORIGINAL USER COMMAND BY ADDING TO END-OF-LINE BYTE›31152 DBGPTR=DBGST›31154 IF PEEK(DBGPTR+4)=55 OR PEEK(DBGPTR+4)=1 THEN 31164›31156 DBGEOL=DBGPTR+PEEK(DBGPTR+2)-1›31158 DBGCOM=DBGPTR+4›31160 POKE DBGEOL,PEEK(DBGEOL)+PEEK(DBGCOM)›31162 POKE DBGCOM,55›31164 DBGPTR=DBGPTR+PEEK(DBGPTR+2)›31166 IF PEEK(DBGPTR)+256*PEEK(DBGPTR+1)<31000 THEN 31154›31168 RETURN ›31170 REM ›31172 REM SUBROUTINE TO FIND STMNT AND REMOVE ERR. 2-BYTE LINE NO. EXPECTED IN DBGLN1 AND DBGLN2.›31174 REM PTR TO LINE IS RETURNED IN DBGPTR.›31176 DBGPTR=DBGST›31178 IF DBGLN1=PEEK(DBGPTR) AND DBGLN2=PEEK(DBGPTR+1) THEN 31186›31180 DBGPTR=DBGPTR+PEEK(DBGPTR+2)›31182 GOTO 31178›31184 REM REMOVE ERR›31186 IF PEEK(DBGPTR+4)<>55 THEN RETURN ›31188 DBGEOL=DBGPTR+PEEK(DBGPTR+2)-1›31190 DBGCOM=DBGPTR+4›31192 IF PEEK(DBGEOL)>100 THEN 31200›31194 POKE DBGCOM,PEEK(DBGEOL)-22›31196 POKE DBGEOL,22›31198 RETURN ›31200 POKE DBGCOM,PEEK(DBGEOL)-155›31202 POKE DBGEOL,155›31204 RETURN ›31206 REM ›31208 REM SUBROUTINE TO CLEAR ALL ERRORS›31210 REM ›31212 DBGSAVE=DBGPTR:DBGPTR=DBGST›31214 IF PEEK(DBGPTR+4)<>55 THEN 31228›31216 DBGEOL=DBGPTR+PEEK(DBGPTR+2)-1:DBGCOM=DBGPTR+4›31218 IF PEEK(DBGEOL)>100 THEN 31226›31220 REM NON-REM LINE HAS 22 FOR EOL›31222 POKE DBGCOM,PEEK(DBGEOL)-22:POKE DBGEOL,22:GOTO 31228›31224 REM REM LINE HAS 155 FOR EOL›31226 POKE DBGCOM,PEEK(DBGEOL)-155:POKE DBGEOL,155›31228 DBGPTR=DBGPTR+PEEK(DBGPTR+2)›31230 IF PEEK(DBGPTR)+256*PEEK(DBGPTR+1)<31000 THEN 31214›31232 DBGPTR=DBGSAVE›31234 RETURN ›