1000 * .LIST OFF 1005 *-------------------------------- 1010 * TRACE/STEP FUNCTION 1015 * (C) DAVID A WHEELER 1982 1020 * DEDICATED TO THE ORIGINAL 1025 * TRACER IN THE STANDARD APPLE 1030 * MONITOR, CREATED BY 1035 * S. WOZNIAK & A. BAUM. 1040 * CREATED BY: 1045 * DAVID A WHEELER (C) 1982 1050 * THIS HAS ZPAGE SEPERATION 1055 * AND A FLOATING STACK. 1060 * 'HOOKS' MAKE THIS PROGRAM 1065 * EASILY DEFINABLE. 1070 * TO ACTIVATE, TYPE *4000G 1075 * (THIS SAVES THE ZERO PAGE IN 1080 * $4100.41FF). 1085 * (THIS ASSUMES A STARTING ADDRESS OF $4000) 1090 * THEN TYPE: 1095 * (START ADDRESS)CTRL-Y 1100 * PRESS ANY KEY TO STEP. 1105 * PRESS T TO TRACE (ANY KEY TO 1110 * STEP) 1115 * PRESS P TO PRINT PROGRAM STEP 1120 * HISTORY, FIRST PRINTED 1125 * BEING THE LATEST. 1130 * PRESS ESC TO ESCAPE. 1135 * 1140 * AFTER PRESSING ESC, TYPE CONTROL-Y RETURN TO RESTART. 1145 * 1150 * ACTION LIST COMMANDS EXPLAINED 1155 * ELSEWHERE. PRESENT COMMANDS: 1160 * (B)REAK, (J)SR, (I)NVISIBLE, 1165 * (L)IST, (N)EW, (U)NDO, 1170 * (P)ROGRAM HISTORY (LIKE P), 1175 * (C)ASE FOR FLAGS. 1180 * (Y)ELL (NOISE ON A STEP). 1185 * (F)LIP: ON/OFF DUAL SCREEN DISPLAY. 1190 * (G)UARANTEE (ACTION): THIS RANGE OF CODE DOESN'T USE/CHANGE DISPLAY. 1195 * 1200 * STEP INSTRUCTIONS: 1205 * (V)ICTIM DISPLAY, (N)ORMAL DISPLAY, (P)C HISTORY, 1210 * (CONTROL-C) STOP INVISIBLE RUN, 1215 * (ESC) ESCAPE TO MONITOR. 1220 * 1225 * CONTAINS WORKING FLIP40COL. 1230 *-------------------------------- 1235 LENGTH .EQ $002F 1240 INVFLG .EQ $32 1245 SCRL .EQ $30 ; USED TO PT TO SCREEN FOR SCREEN FLIP. 1250 SCRH .EQ $31 1255 SBUFL .EQ $26 ; USED TO PT TO SCREEN BUF FOR SCREEN FLIP. 1260 SBUFH .EQ $27 1265 PCH .EQ $003B 1270 PCL .EQ $003A 1275 ACC .EQ $0045 1280 XREG .EQ ACC+1 1285 SPNT .EQ ACC+4 1290 A3H .EQ $0041 1295 A3L .EQ $0040 1300 CH .EQ $24 1305 YSAV .EQ $34 1310 CSWL .EQ $36 1315 A1 .EQ $3C 1320 PREG .EQ $0048 1325 RET .EQ $8D ;CONSTANT 1330 ESC .EQ $9B 1335 TOTRACE .EQ 'T+$80 1340 SPACE .EQ ' +$80 1345 STACK .EQ $100 ; BEGINNING OF STACK. 1350 IN .EQ $200 1355 IRQLOC .EQ $03FE 1360 KBD .EQ $C000 1365 KBDSTROBE .EQ $C010 1370 SPEAKER .EQ $C030 1375 INSDS1 .EQ $F882 1380 INSTDSP.MON .EQ $F8D0 1385 PRINTAX .EQ $F941 1390 PRBLNK .EQ $F948 1395 PCADJ3 .EQ $F956 1400 PCADJ2 .EQ $F954 1405 REGDSP1 .EQ $FADA 1410 CROUT .EQ $FD8E 1415 PRBYTE .EQ $FDDA 1420 COUT .EQ $FDED 1425 A1PC .EQ $FE75 1430 PRERR .EQ $FF2D 1435 RESTORE .EQ $FF3F 1440 SAV1 .EQ $FF4C 1445 SAVE .EQ $FF4A 1450 REALMON .EQ $FF65 1455 USR .EQ $3F8 1460 *--------------------------------- 1465 * CONSTANTS. 1470 NORMALMSK .EQ $FF 1475 INVERSEMSK .EQ $3F 1480 INTERRUPTCHAR .EQ $83 ; CONTROL-C: INTERRUPT INVISIBLE 1485 MAXACTTBL .EQ 250 ; 50 COMMANDS MAX. 1490 * COULD BE 51, BUT THIS SAVES A SECTOR SAVING ON DOS 3.3 1495 JMP .EQ $4C 1500 OPJSR .EQ $20 1505 RTBL .EQ $FB19 1510 TOFFSET .EQ $0000 ; ADDED TO ORIGIN FOR TARGET ADDRESS 1515 * (IE WHERE CODE IS STORED, VS WHERE IT RUNS) 1520 *--------------------------------- 1525 .OR $3800 1530 .TA *+TOFFSET 1535 ZSTART 1540 START 1545 JMP CTRLYSETUP 1550 TRACE JMP BEGINTRACE ; BEGIN TRACING 1555 INSTDSP JMP DISPINSTRUCTION ; LIKE $F8D0 BUT NO STARTING RET. 1560 NEWCMD RTS ; NEW COMMANDS FROM 1565 NOP ; STEP. PUT A JMP HERE, 1570 NOP ; THEN CMP WITH KEY. 1575 NEWOP RTS ; NEW OPCODES 1580 NOP 1585 NOP 1590 MON JMP REALMON ; JMP TO MONITOR (BRK OR ESC FROM STEP) 1595 REALVDISP JMP SWAP40COL ; DISPLAY VICTIM PAGE. 1600 REALTDISP JMP SWAP40COL ; DISPLAY TRACER PAGE. 1605 * BEFORE EXECUTING A MEMORY-CHANGING INSTRUCTION, DO THIS 1610 BEFOREMEMCHANGE RTS 1615 NOP 1620 NOP 1625 * AFTER EXECUTING A MEMORY-CHANGING INSTRUCTION. 1630 AFTERMEMCHANGE RTS 1635 NOP 1640 NOP 1645 EXPAN NOP 1650 NOP 1655 NOP 1660 NOP 1665 LETTERS 1670 LTA .DA BEEP-1 1675 LTB .DA BREAK ;NON-IMMEDIATE 1680 LTC .DA CASESWITCH-1 ; CHANGE CASE DISPLAY OF FLAGS. 1685 LTD .DA BEEP-1 1690 LTE .DA BEEP-1 1695 LTF .DA FLIPSCREENCOMMAND-1 1700 LTG .DA GUARANTEEON ; SCREEN FLIP NOT NECESSARY 1705 LTH .DA BEEP-1 1710 LTI .DA INVISIBLE ; TRACE, BUT DON'T DISPLAY RESULT. 1715 LTJ .DA JSRAREA ; IF PC IN THIS AREA, JSR TO IT. 1720 LTK .DA BEEP-1 1725 LTL .DA LISTACT-1 ; LIST CURRENT ACTIONS. 1730 LTM .DA BEEP-1 1735 LTN .DA CLEARACT-1 ; CLEAR ALL ACTIONS 1740 LTO .DA BEEP-1 1745 LTP .DA PRINTPCTBL-1 ; PRINT LAST VALUES OF THE PC. 1750 LTQ .DA BEEP-1 1755 LTR .DA BEEP-1 1760 LTS .DA BEEP-1 1765 LTT .DA BEEP-1 1770 LTU .DA UNDOACT-1 ; UNDO LAST ACTION COMMAND. 1775 LTV .DA BEEP-1 1780 LTW .DA BEEP-1 1785 LTX .DA BEEP-1 1790 LTY .DA YELL ; ACT TABLE: MAKE NOISE. 1795 LTZ .DA BEEP-1 1800 *--------------------------------- 1805 LETTYPE 1810 TA .HS 00010000000001 1815 TH .HS 00010100000000 1820 TO .HS 00000000000000 1825 TV .HS 0000000100 1830 ONFLGTABLE .AS -"NVXBDIZC" 1835 OFFLGTABLE .AS -"NVXBDIZC" 1840 .OR ZSTART+$80 1845 .TA *+TOFFSET 1850 CONTINUE .HS 00 ; NEGATIVE IF CONTINUOUS. 1855 PCPOINT .HS 00 1860 TEMP .HS 00 1865 TRACEP .HS 00 1870 INSTLEN .HS 00 ; LENGTH-1 OF NEXT INSTRUCTION TO EXEC 1875 INVIS .HS 00 ; INVISIBLE? 1880 NCOUT .DA COUT ; ROOM FOR OLD COUT. 1885 B4JSRPC .DA MON ; HOLDS RETURN PC WHEN AN AREA JSR OCCURS. 1890 TEMPST .HS 00 ; TEMP. HOLDER FOR TRACER STACK PTR. 1895 JSRFLAG .HS 00 ; IS THE LAST TARGET A JSR? 1900 SOFFSET .HS 60 ; TRACER STACK OFFSET. 1905 FLIPSCREEN .HS 00 ; FLIP SCREEN DISPLAY? (0=FALSE) 1910 DEFAULTSCREEN .HS 00 ; PREFERRED SCREEN (0=TRACER) 1915 CURRENTSCREEN .HS 00 ; CURR SCREEN (0=TRACER) 1920 GUARANTEESCREEN .HS 00 ; GUARANTEE INSTR. WON'T CHANGE SCREEN (0=FALSE) 1925 EXPBOX .HS 00000000 1930 MSKTABLE .HS 8040201008040201 ; WHICH BIT IS WHICH... 1935 PREDEFAULTJMP 1940 .OR ZSTART+$9D 1945 .TA *+TOFFSET 1950 JMPAT JMP BEEP 1955 INITBL 1960 NOP 1965 NOP 1970 JMP NBRNCH 1975 JMP BRANCH 1980 TARGET 1985 * THIS SECTION IS CONTINUOUSLY 1990 * CHANGED... 1995 NOP 2000 NOP 2005 NOP 2010 JMP NBRNCH 2015 JMP BRANCH 2020 .AS "DAVID A WHEELER (C) 1982" 2025 TEMPX .HS 00 2030 ENDVECTORS 2035 *--------------------------------- 2040 .OR ZSTART+$100 2045 .TA *+TOFFSET 2050 * ZPAGE IS $100 HIGHER THAN PROGRAM START. 2055 POSITION 2060 TACC .EQ ACC+POSITION 2065 TXREG .EQ TACC+1 2070 TYREG .EQ TACC+2 2075 TSTATUS .EQ TACC+3 2080 TSPNT .EQ TACC+4 2085 .OR ZSTART+$180 2090 * KLUDGE: PUTTING CHANGEABLE CODE WHERE ZERO PAGE COULD BE (BUT 2095 * CURRENTLY IS NOT) 2100 .TA *+TOFFSET 2105 SWAP40COL 2110 LDA #$4 2115 STA SCRH 2120 LDA /SCREENBUFFER 2125 STA SBUFH 2130 LDA #0 2135 STA SBUFL 2140 STA SCRL 2145 * DONE INITS; NOW SWAP SCREENS. 2150 .1 LDY #120 2155 .11 LDA (SCRL),Y 2160 PHA 2165 LDA (SBUFL),Y 2170 STA (SCRL),Y 2175 PLA 2180 STA (SBUFL),Y 2185 DEY 2190 BPL .11 ; COPY REST OF 3 LINES. 2195 * ADD 128 TO SCL & SBUFL. THIS COULD BE MADE FASTER. 2200 LDA SCRL 2205 EOR #$80 2210 STA SCRL 2215 STA SBUFL 2220 BNE .1 2225 INC SBUFH 2230 INC SCRH 2235 LDA SCRH 2240 CMP #8 ; CMP TO END OF 40 COL PAGE 2245 BNE .1 ; NOPE, NOT DONE YET. 2250 .9 2255 .91 RTS 2260 SPACEOUT LDA #SPACE 2265 JMP COUT 2270 DISPINSTRUCTION 2275 LDX PCL ; LIKE $F8D0 BUT DONT START WITH CR 2280 LDY PCH 2285 JSR $FD99 2290 JSR $F889 2295 JMP $F8D3 2300 .OR ZSTART+$200 2305 .TA *+TOFFSET 2310 CTRLYSETUP 2315 * SET-UP CNTL-Y (ALSO S AND T ON AUTOSTART) 2320 * TO CHECK. 2325 TXA 2330 PHA 2335 PHA 2340 LDA #JMP 2345 STA USR 2350 LDA #COMMAND 2355 STA USR+1 2360 LDA /COMMAND 2365 STA USR+2 2370 LDA #$FF ;PUT $FFFF INTO PCLIST. 2375 LDX #0 2380 .1 STA PCTBL,X 2385 DEX 2390 BNE .1 2395 LDX #$2A ; COPY ZPAGE INTO TRACER IMAGE. 2400 .22 LDA $1F,X 2405 STA POSITION+$1F,X 2410 DEX 2415 BNE .22 2420 LDA #0 2425 STA CONTINUE 2430 PHP 2435 PLA 2440 STA PREG ; SETUP PROCESSOR STATUS REGISTER. 2445 PLA 2450 TAX 2455 PLA 2460 RTS 2465 *--------------------------------- 2470 BEGINTRACE 2475 CLD 2480 JSR A1PC 2485 LDA SPNT 2490 SEC 2495 SBC SOFFSET ; TRUE TRACER STACK FAR DOWN FROM VICTIM. 2500 TAX 2505 TXS 2510 PHP 2515 PLA 2520 STA TRACEP 2525 * STORE PRESENT COUT. 2530 LDA CSWL 2535 STA NCOUT 2540 LDA CSWL+1 2545 STA NCOUT+1 2550 STEP 2555 LDX PCPOINT ; STORE PC 2560 LDA PCL 2565 STA PCTBL,X 2570 INX 2575 LDA PCH 2580 STA PCTBL,X 2585 INX 2590 STX PCPOINT 2595 LDA NCOUT ; RESTORE OLD COUT PTR. 2600 STA CSWL 2605 LDA NCOUT+1 2610 STA CSWL+1 2615 * NOW CHECK IF ANY PC ACTS ARE HERE 2620 LDX #0 2625 STX INVIS ; NORMALLY NOT INVISIBLE. 2630 STX JSRFLAG ; NORMALLY NOT AUTO JSR 2635 STX GUARANTEESCREEN ; NORMALLY NOT GUARANTEED. 2640 .1 CPX ACTNUM 2645 BEQ FINISHEDACTTBL 2650 LDY ACTTBL,X 2655 INX 2660 BMI .2 2665 LDA PCL 2670 CMP ACTTBL,X 2675 INX 2680 LDA PCH 2685 SBC ACTTBL,X 2690 INX 2695 BCC .21 2700 LDA ACTTBL,X 2705 CMP PCL 2710 INX 2715 LDA ACTTBL,X 2720 SBC PCH 2725 INX 2730 BCC .1 2735 * GO TO THAT ROUTINE... 2740 TYA ; DOUBLE Y. 2745 ASL 2750 TAY 2755 LDA LETTERS,Y 2760 STA JMPAT+1 2765 INY 2770 LDA LETTERS,Y 2775 STA JMPAT+2 2780 JSR JMPAT 2785 JMP .1 2790 .2 INX 2795 INX 2800 .21 INX 2805 INX 2810 JMP .1 2815 FINISHEDACTTBL 2820 JMP DISPSTATS 2825 IDISP 2830 * INSTRUCTION (TO BE EXEC) DISPLAY 2835 BIT INVIS 2840 BMI .1 ; SKIP IF INVIS. 2845 * NOTE: STILL MUST DISPLAY TO GET BYTE SIZE OF INSTRUCTION. 2850 JSR TDISP ; NO, SWITCH TO TRACER. 2855 .1 JSR INSTDSP ; ACTUALLY DISPLAY INSTRUCTION & GET BYTE SIZE. 2860 STY INSTLEN ; STORE INSTRUCTION LENGTH. 2865 LDX #4 2870 XQINIT 2875 LDA INITBL-1,X 2880 STA TARGET,X 2885 DEX 2890 BNE XQINIT 2895 JMP KEYCHECK 2900 XBRK 2901 * BREAK INSTRUCTION-GO TO MONITOR 2905 JSR TDISP 2910 JSR INSDS1 2915 JSR REGDSP1 2916 JMP MON 2920 BEGINEXECUTE 2925 BIT JSRFLAG ; IS THIS A JSR AREA? 2930 BPL .96 ; !!!TEMP 2935 JMP XJSRAREA 2940 .96 2945 LDX #0 ; EXPECTS X=0, Y=LENGTH-1 OF INSTRUCTION 2950 LDY INSTLEN 2955 LDA (PCL,X) 2960 JSR NEWOP 2965 CMP #0 ; LDA #0 IN NEWOP TO BREAK. 2970 BEQ XBRK 2975 LDY LENGTH 2980 CMP #$20 2985 BNE .11 2990 JMP XJSR2 2995 .11 CMP #$60 3000 BEQ XRTS 3005 CMP #$4C 3010 BNE .22 3015 JMP XJMP 3020 .22 PHA 3025 AND #$9F 3030 EOR #$08 3035 BNE .1 3040 JMP STACKERS 3045 .1 PLA 3050 CMP #$9A 3055 BEQ XTXS 3060 CMP #$BA 3065 BEQ XTSX 3070 CMP #$40 3075 BEQ XRTI 3080 CMP #$6C 3085 BEQ XJMPAT 3090 AND #$1F 3095 EOR #$14 3100 CMP #$04 3105 BEQ XQ2 3110 XQ1 3115 LDA (PCL),Y 3120 XQ2 3125 STA TARGET,Y 3130 DEY 3135 BPL XQ1 3140 EXECTARG 3145 * EXEC WHAT'S IN TARGET. 3150 JSR BEFOREMEMCHANGE 3155 * FLIP TO VICTIM DISPLAY IF NECESSARY. 3160 BIT FLIPSCREEN 3165 BPL .1 ; NO FLIPSCREEN. 3170 BIT GUARANTEESCREEN 3175 BMI .1 ; GUARANTEED NOT TO CHANGE SCREEN. 3180 JSR VDISP 3185 .1 JSR ZFLIP ; NOW ZERO PAGE IS TARGET CODE'S. 3190 PHP 3195 PLA 3200 STA TRACEP 3205 LDA TSTATUS ; RESTORE REGISTERS. 3210 PHA 3215 LDA TACC 3220 LDY TYREG 3225 LDX TXREG 3230 PLP 3235 JMP TARGET 3265 XTSX 3270 LDA SPNT 3275 STA XREG 3280 3285 SEC 3290 JMP PCINC3 3295 XTXS 3300 LDX XREG 3305 TXS 3310 JMP NEWSPNT 3315 XRTS 3320 LDX SPNT 3325 TXS 3330 PLA 3335 CLC 3340 ADC #1 3345 STA PCL 3350 PLA 3355 ADC #0 3360 STA PCH 3365 JMP NEWSPNTJMP 3370 XRTI 3375 LDX SPNT 3380 TXS 3385 PLA 3390 STA PREG 3395 PLA 3400 STA PCL 3405 PLA 3410 STA PCH 3415 JMP NEWSPNTJMP 3420 PCINC2 3425 STA PCH 3430 PCINC3 3435 LDA LENGTH 3440 JSR PCADJ3 3445 STY PCH 3450 CLC 3455 BCC NEWPCL 3460 XJMP 3465 CLC 3470 XJMPAT 3475 LDA (PCL),Y 3480 TAX 3485 DEY 3490 LDA (PCL),Y 3495 STX PCH 3500 NEWPCL 3505 STA PCL 3510 BCS XJMP 3515 DONEEXEC 3520 JMP STEP 3525 DISPSTATS 3530 BIT INVIS ; IF INVISIBLE, DON'T PRINT. 3535 BMI .3 ; INVIS - DONT PRINT 3540 JSR TDISP ; GOTO TRACER DISP 3545 JSR CROUT 3550 JSR SPACEOUT 3555 JSR REGDSP1 3560 JSR SPACEOUT 3565 INC CH 3570 INC CH 3575 INC CH 3580 JSR FLAGPRINT 3585 LDX #39 ; GOTO EDGE 3590 STX CH 3595 LDA #SPACE 3600 BIT JSRFLAG 3605 BPL .7 3610 LDA #'J+$80 3615 .7 JSR COUT 3620 .3 3625 JMP IDISP 3630 *--------------------------------- 3635 * NOW WAIT FOR KEY TO CONTINUE, 3640 * ESC TO ESCAPE. 3645 KEYCHECK 3650 BIT INVIS ; IF INVISIBLE, CHECK IF INTERRUPTED. 3655 BMI CHECKTOSTOPINVIS 3660 BIT CONTINUE 3665 BMI CHECKTOSTOPCONTIN 3670 REALKEYCHECK 3675 * SINGLE STEP- SWITCH TO DEFAULT SCREEN 3680 BIT DEFAULTSCREEN 3685 BMI .11 3690 JSR TDISP 3695 JMP .12 3700 .11 JSR VDISP 3705 .12 3710 .1 LDA KBD ; WAIT FOR STEP OR COMMAND 3715 BPL .1 3720 BIT KBDSTROBE 3725 JSR NEWCMD 3730 CMP #ESC 3735 BEQ JMPMON 3740 CMP #INTERRUPTCHAR 3745 BEQ .1 ; IGNORE INTERRUPT CHAR. 3750 CMP #'P+$80 3755 BNE .5 3760 JSR TDISP 3765 JSR PRINTPCTBL 3770 JMP REALKEYCHECK 3775 .5 CMP #'V+$80 3780 BNE .52 3785 LDA #$FF 3790 STA DEFAULTSCREEN 3795 JMP REALKEYCHECK 3800 .52 CMP #'N+$80 ; "NORMAL" DISPLAY 3805 BNE .51 3810 LDA #0 3815 STA DEFAULTSCREEN 3820 JMP REALKEYCHECK 3825 .51 CMP #TOTRACE 3830 BNE JMPSTP 3835 LDA #$FF 3840 STA CONTINUE 3845 * CHECK FOR SCREEN COMMAND. 3850 JMPSTP JMP BEGINEXECUTE 3855 JMPMON JSR TDISP 3860 JMP MON 3865 CHECKTOSTOPCONTIN 3870 BIT KBD 3875 BPL JMPSTP ; NO KEYPRESS; NEXT STEP. 3880 BIT KBDSTROBE 3885 LDA #0 3890 STA CONTINUE 3895 BEQ REALKEYCHECK ; ALWAYS 3900 CHECKTOSTOPINVIS 3905 * INTERRUPT: STOP INVISIBLE! 3910 LDA KBD 3915 BPL JMPSTP ; NO KEYPRESS; NEXT STEP. 3920 CMP #INTERRUPTCHAR 3925 BNE JMPSTP 3930 BIT KBDSTROBE ; TAKE AWAY CHAR. 3935 LDA #0 3940 STA INVIS ; TURN OFF INVIS. 3945 STA CONTINUE 3950 * FLIP TO OTHER DISPLAY 3955 BIT CURRENTSCREEN 3960 BPL .19 3965 * STA CURRENTSCREEN ; A=0- SET CURRENT SCREEN TO TRACER. 3970 JSR TDISP 3975 .19 3980 * RESTORE NORMAL TRACER COUT 3985 LDA NCOUT 3990 STA CSWL 3995 LDA NCOUT+1 4000 STA CSWL+1 4005 * DISPLAY INTERRUPT MESSAGE 4010 JSR CROUT 4015 LDA PCH 4020 JSR PRBYTE 4025 LDA PCL 4030 JSR PRBYTE 4035 LDA #'I+$80 4040 JSR COUT 4045 * MAKE SOME NOISE, TOO. 4050 LDX #$80 4055 LDY #$F0 4060 JSR MAKESOUND 4065 JMP DISPSTATS ; DISPLAY CURRENT STATUS. 4070 BRANCH 4075 * BRANCHES CAN'T CHANGE MEMORY OR REGISTERS, SO DON'T SAVE THEM. 4080 LDA TRACEP 4085 PHA 4090 PLP 4095 JSR ZFLIP 4100 CLC 4105 LDY #$01 4110 LDA (PCL),Y 4115 JSR PCADJ3 4120 STA PCL 4125 TYA 4130 SEC 4135 JMP PCINC2 4140 NBRNCH 4145 STA TACC 4150 STX TXREG 4155 STY TYREG 4160 PHP 4165 PLA 4170 STA TSTATUS 4175 LDA TRACEP 4180 PHA 4185 PLP 4190 JSR ZFLIP ; NOW ZERO PAGE IS TRACER'S. 4195 JSR AFTERMEMCHANGE ; CHECK ON MEMORY CHANGES. 4200 BIT JSRFLAG ; WAS THIS A JSR AREA?? 4205 BPL .1 4210 * JOY. THE STACK IS THE REAL ONE!!! RESTORE STACK & PC. THEN SKIP UP. 4215 TSX 4220 STX TSPNT-POSITION ; STACK PTR (NOW IN ZERO PG) 4225 LDA B4JSRPC+1 4230 STA STACK,X 4235 STA PCH 4240 DEX 4245 LDA B4JSRPC 4250 STA STACK,X 4255 STA PCL 4260 LDX TEMPST 4265 TXS 4270 INC PCL 4275 BNE .11 4280 INC PCH 4285 .11 JMP DONEEXEC ; FINISHED EXECUTING JSR. 4290 .1 SEC 4295 JMP PCINC3 4300 *--------------------------------- 4305 PRINTPCTBL 4310 JSR CROUT 4315 LDX PCPOINT 4320 .1 DEX 4325 LDA PCTBL,X 4330 JSR PRBYTE 4335 DEX 4340 LDA PCTBL,X 4345 JSR PRBYTE 4350 LDA #SPACE 4355 JSR COUT 4360 CPX PCPOINT 4365 BNE .1 4370 RTS 4375 *--------------------------------- 4380 STACKERS 4385 PLA 4390 LDX SPNT 4395 TXS 4400 CMP #$08 4405 BEQ XPHP 4410 CMP #$28 4415 BEQ XPLP 4420 CMP #$68 4425 BEQ XPLA 4430 XPHA 4435 LDA ACC 4440 PHA 4445 JMP NEWSPNT 4450 XPLA 4455 PLA 4460 STA ACC 4465 JMP NEWSPNT 4470 XPHP 4475 LDA PREG 4480 PHA 4485 JMP NEWSPNT 4490 XPLP 4495 PLA 4500 ORA #$30 ; X AND B ALWAYS SET. 4505 STA PREG 4510 NEWSPNT 4515 TSX 4520 STX SPNT 4525 TXA 4530 SEC 4535 SBC #$10 4540 TAX 4545 TXS 4550 SEC 4555 JMP PCINC3 4560 XJSR2 4565 LDX SPNT 4570 TXS 4575 CLC 4580 LDA PCL 4585 ADC #2 4590 TAX 4595 LDA PCH 4600 ADC #0 4605 PHA 4610 TXA 4615 PHA 4620 LDY #2 4625 LDA (PCL),Y 4630 TAX 4635 DEY 4640 LDA (PCL),Y 4645 STA PCL 4650 STX PCH 4655 NEWSPNTJMP 4660 * A NEWSPNT BUT THIS DOESN'T ADD. 4665 TSX 4670 STX SPNT 4675 TXA 4680 SEC 4685 SBC #$10 4690 TAX 4695 TXS 4700 SEC 4705 JMP DONEEXEC 4710 FLAGPRINT 4715 LDX #0 4720 FLAGLOOP 4725 LDA MSKTABLE,X 4730 AND PREG 4735 BEQ .2 4740 LDA #INVERSEMSK ; INVERSE 4745 STA INVFLG 4750 LDA ONFLGTABLE,X 4755 BNE .1 ; ALWAYS. 4760 .2 LDA OFFLGTABLE,X 4765 .1 4770 JSR COUT 4775 LDA #NORMALMSK 4780 STA INVFLG 4785 INX 4790 CPX #8 4795 BNE FLAGLOOP 4800 RTS 4805 ZFLIP 4810 LDX #$2A ; NUMBER OF LOCATIONS TO MOVE. 4815 * THIS SAVES $20..$49 4820 * IF CHANGED, ALSO CHANGE COPY ROUTINES IN INIT. 4825 * WARNING: CURRENT KLUDGE TO GET SOME MEMORY STARTS CODE AT $80 IN. FIX. 4830 FLIPLOOP 4835 LDA $1F,X 4840 LDY POSITION+$1F,X 4845 STY $1F,X 4850 STA POSITION+$1F,X 4855 DEX 4860 BNE FLIPLOOP 4865 RTS 4870 * 4875 * 4880 * 4885 BEEP JMP PRERR 4890 COMMAND 4895 * USER HAS GIVEN A COMMAND... 4900 * IS IT TO TRACE OR A SETUP? 4905 LDY YSAV 4910 INC YSAV 4915 LDA IN,Y 4920 CMP #RET 4925 BEQ CMDTRACE 4930 CMP #'A+$80 4935 BCC CMDTRACE 4940 CMP #'Z+$81 4945 BCC CMDLETTER 4950 CMDTRACE 4955 JMP TRACE 4960 CMDLETTER 4965 * LETTER A..Z AFTER CTRL-Y, PUSH IT 4970 * ON THE STACK. 4975 * CARRY IS SET. 4980 SBC #'A+$80-1 4985 TAX 4990 LDA LETTYPE,X 4995 BNE ACTTYPE 5000 TXA ; IMMEDIATE ACTION. JUMP TO IT. 5005 ASL ; DOUBLE 5010 TAY 5015 LDA LETTERS+1,Y 5020 PHA 5025 LDA LETTERS,Y 5030 PHA 5035 RTS ; GOTO SUBROUTINE. 5040 ACTTYPE 5045 * NOT IMMEDIATE... 5050 CMP #$80 5055 BNE .1 5060 TXA 5065 ORA #$80 5070 BNE .2 5075 .1 TXA 5080 .2 5085 LDX ACTNUM 5090 CPX #MAXACTTBL 5095 BEQ NOMEMLEFT 5100 STA ACTTBL,X 5105 INX 5110 LDY #0 5115 PUTREGLOOP 5120 LDA A1,Y 5125 STA ACTTBL,X 5130 INX 5135 INY 5140 CPY #4 5145 BNE PUTREGLOOP 5150 STX ACTNUM 5155 RTS1 5160 RTS 5165 NOMEMLEFT 5170 JMP PRERR 5175 LISTACT 5180 CLC 5185 LDY #0 5190 .1 CPY ACTNUM 5195 BEQ RTS1 5200 LDA ACTTBL,Y 5205 ADC #'A 5210 ORA #$80 5215 PHA 5220 INY 5225 LDX ACTTBL,Y 5230 INY 5235 LDA ACTTBL,Y 5240 JSR PRINTAX 5245 LDA #'.+$80 5250 JSR COUT 5255 INY 5260 LDX ACTTBL,Y 5265 INY 5270 LDA ACTTBL,Y 5275 INY 5280 JSR PRINTAX 5285 PLA 5290 JSR COUT 5295 JSR PRBLNK 5300 BEQ .1 5305 RTS 5310 CLEARACT 5315 LDA #0 5320 STA ACTNUM 5325 RTS 5330 UNDOACT 5335 LDA ACTNUM 5340 BEQ .1 5345 SEC 5350 SBC #$5 5355 STA ACTNUM 5360 .1 RTS 5365 CASESWITCH 5370 LDX #0 5375 STX TEMP 5380 LDA ONFLGTABLE,X 5385 CMP OFFLGTABLE,X 5390 BNE .1 5395 LDA #$20 ; LOWERCASE. 5400 STA TEMP 5405 .1 CLC 5410 LDA ONFLGTABLE,X 5415 ADC TEMP 5420 STA OFFLGTABLE,X 5425 INX 5430 CPX #8 5435 BNE .1 5440 RTS 5445 FLIPSCREENCOMMAND 5450 LDA FLIPSCREEN 5455 EOR #$FF 5460 STA FLIPSCREEN 5465 RTS 5470 BREAK LDA #0 5475 STA CONTINUE 5480 RTS 5485 INVISIBLE 5490 LDA #$FF 5495 STA INVIS 5500 LDA #RTS1 5505 STA CSWL 5510 LDA /RTS1 5515 STA CSWL+1 5520 RTS 5525 GUARANTEEON 5530 LDA #$FF ; GUARANTEE THAT FLIP NOT NECESSARY. 5535 STA GUARANTEESCREEN 5540 RTS 5545 JSRAREA 5550 LDA #$FF 5555 STA JSRFLAG 5560 RTS 5565 XJSRAREA 5570 .1 LDA #OPJSR 5575 STA TARGET 5580 LDA PCH 5585 STA TARGET+2 5590 LDA PCL 5595 STA TARGET+1 5600 TSX 5605 STX TEMPST 5610 * NOW FIND OLD RETURN ADDRESS, STORE IT & YANK STACK PTR. 5615 LDX TSPNT-POSITION 5620 INX 5625 LDA STACK,X 5630 STA B4JSRPC 5635 INX 5640 LDA STACK,X 5645 STA B4JSRPC+1 5650 STX TSPNT-POSITION 5655 TXS ; NOW SWITCH STACK PTR. 5660 JMP EXECTARG 5665 YELL 5670 * MAKE NOISE; MUST SAVE X. 5675 STX TEMPX 5680 LDA PCL 5685 EOR #$FF 5690 TAX 5695 INX 5700 LDY PCH 5705 * INY 5710 * INY 5715 JSR MAKESOUND 5720 LDX TEMPX 5725 RTS 5730 MAKESOUND 5735 * X=PITCH, Y=LENGTH, A TRASHED. 5740 TXA 5745 .2 TAX ; RESTORE X 5750 .1 DEX 5755 NOP 5760 NOP 5765 BNE .1 5770 LDX SPEAKER 5775 DEY 5780 BNE .2 5785 RETURNNEARBY 5790 RTS 5795 VDISP 5800 * DISPLAY VICTIM'S PAGE; IGNORES COMMAND IF ALREADY THERE. 5805 BIT CURRENTSCREEN 5810 BMI RETURNNEARBY 5815 LDA #$FF 5820 STA CURRENTSCREEN 5825 JMP REALVDISP 5830 TDISP 5835 * TRACER DISPLAY; IGNORES COMMAND IF ALREADY THERE. 5840 BIT CURRENTSCREEN 5845 BPL RETURNNEARBY 5850 LDA #0 5855 STA CURRENTSCREEN 5860 JMP REALTDISP 5865 .LIST ON 5870 ZCODEEND .EQ * 5875 .OR ZSTART+$700 5880 .TA *+TOFFSET 5885 ACTTBL .EQ * ; STORE ACTION VALUES HERE. 5890 * FORM: COMMAND MINL MINH MAXL MAXH ; 5 BYTES EACH ACTION. 5895 .HS 090096FFFF ; 9600.FFFF JSR. 5900 * (FOR TESTING) 5905 .OR ACTTBL+MAXACTTBL 5910 .TA *+TOFFSET 5915 ACTNUM .HS 05 5920 ZEND 5925 PCTBL .EQ ACTTBL+$100 ; STORE LAST 128 PC VALUES HERE. 5930 SCREENBUFFER .EQ PCTBL+$100 ; BUFFER FOR SCREEN. 5935 LASTM .EQ PCTBL+$FF ; LAST MEMORY SPOT USED BY TRACER W/OUT FLIPPING 5940 * THESE MUST BE >0 OR TROUBLE. 5945 MUSTPLUS1 .EQ POSITION-ENDVECTORS 5950 MUSTPLUS2 .EQ ACTTBL-ZCODEEND 5955 MUSTPLUS3 .EQ JMPAT-PREDEFAULTJMP 5960 ZZLENGTH .EQ ZEND-ZSTART 5965 .LIST OFF :