0100 ; BASIC TRACER›0110 ; BY KEVIN GEVATOSKY›0120 ; (c) 1986, ANTIC PUBLISHING›0130 STMCUR = $8A ;Line # of cur. BASIC statement›0140 SRCPNT = $CB›0150 DESPNT = $CD›0160 TIMVAL = $CF ;Delay timer›0170 ZPOINT = $D0›0180 ROMOFF = $FF ;BASIC ROM 'off'›0190 SDLSTL = $0230›0200 CH = $02FC›0210 SOURCE = $A000›0220 STGO = $A97E›0230 DESTIN = $5000›0240 SKCTL = $D20F›0250 PORTB = $D301 ;ROM switch›0260 STARTCODE = $0100›0270 *= $0100›0280 RAMBAS›0290 JSR SETUP›0300 JMP MOVE ;Move BASIC›0310 SETUP›0320 LDA # SOURCE›0350 STA SRCPNT+1›0360 LDA # DESTIN›0390 STA DESPNT+1›0400 LDX #32 ;32 blocks=8K of BASIC code.›0410 LDY #0›0420 RTS ›0430 MOVE›0440 LDA (SRCPNT),Y ;Copy BASIC ROM to RAM›0450 STA (DESPNT),Y›0460 DEY ›0470 BNE MOVE›0480 ;›0490 NXTPAGE›0500 INC SRCPNT+1›0510 INC DESPNT+1›0520 DEX ;Decrement to next block.›0530 BPL MOVE›0540 ;›0550 LDA #ROMOFF ;Turn off BASIC ROM.›0560 STA PORTB›0570 JSR SETUP ;Set up pointers for next move.›0580 MOVE2›0590 LDA (DESPNT),Y ;Move BASIC source code›0600 STA (SRCPNT),Y ;to RAM at $A000›0610 DEY ›0620 BNE MOVE2›0630 ;›0640 NXTPG2›0650 INC SRCPNT+1›0660 INC DESPNT+1›0670 DEX ›0680 BPL MOVE2›0690 ;›0700 SETVEC›0710 LDA # VECTOR›0740 STA $A979›0750 JMP START ;Go set up DL.›0760 *= $0600›0770 ;›0780 ; *** MODIFY DISPLAY LIST ***›0790 START›0800 JSR DLSET›0810 JMP SOURCE ;JuMP to init. RAM-BASIC.›0820 DLSET›0830 LDA SDLSTL ;Move start address of DL›0840 SEC ;back two bytes to make room for›0850 SBC #2 ;more DL data.›0860 STA SDLSTL›0870 STA CHECK ;Save low byte of addr.for later.›0880 STA ZPOINT ;Set up zero-page pointer›0890 BCS NODEC ;to point at new DL start addr.›0900 ;›0910 DEC SDLSTL+1›0920 NODEC›0930 LDA SDLSTL+1›0940 STA ZPOINT+1›0950 LDY #0›0960 NXTBYT›0970 LDA DLDATA,Y ;Get data to modify DL›0980 STA (ZPOINT),Y ;and store it at new add.›0990 INY ›1000 CPY #5›1010 BNE NXTBYT ;Do until done.›1020 ;›1030 FIND›1040 LDA (ZPOINT),Y ;Find end of the DL›1050 CMP #65 ;(65=ANTIC JMP to start of DL.)›1060 BEQ FOUND ;Got it!›1070 ;›1080 INC ZPOINT›1090 BNE NOINC›1100 ;›1110 INC ZPOINT+1›1120 NOINC›1130 JMP FIND ;Keep looking until found.›1140 FOUND›1150 INY ;Point to byte after ANTIC JMP›1160 LDA SDLSTL ;Store start adr of new DL›1170 STA (ZPOINT),Y ;for the ANTIC JMP.›1180 INY ›1190 LDA SDLSTL+1›1200 STA (ZPOINT),Y›1210 LDA DLDATA+3 ;Set zero pg. ptr. to start›1220 STA ZPOINT ;of screen RAM for new›1230 LDA DLDATA+4 ;GR.0 mode line›1240 STA ZPOINT+1›1250 LDA #$80 ;Inverse blank›1260 LDY #39›1270 INVERT›1280 STA (ZPOINT),Y ;Store inverse chars›1290 DEY ›1300 BPL INVERT ;Do for all 40 bytes.›1310 ;›1320 RTS ›1330 ; *** TRACE ROUTINE ***›1340 VECTOR›1350 PHA ;Save reg.A for BASIC.›1360 LDA CHECK ;Get low byte of DL and›1370 CMP SDLSTL ;check to see if still same.›1380 BEQ CONT ;It is, so go on›1390 ;›1400 JSR DLSET ;Set up DL again.›1410 CONT›1420 LDA #0›1430 LDX #5›1440 BLANK›1450 DEX ;Zero out DECVAL›1460 STA DECVAL,X›1470 BNE BLANK›1480 ;›1490 NEXT›1500 LDY #0›1510 LDA (STMCUR),Y ;Get low byte of BASIC›1520 STA LOBYTE ;and save it.›1530 INY ›1540 LDA (STMCUR),Y ;Get hi byte›1550 STA HIBYTE›1560 LDY #0›1570 ;Convert binary to decimal.›1580 SUBTRACT›1590 LDA LOBYTE›1600 SEC ›1610 SBC DECPLC,Y ;Subtract decimal value›1620 STA TEMPLO ;from binary value.›1630 LDA HIBYTE›1640 SBC DECPLC+1,Y›1650 STA TEMPHI›1660 BCS DECSTOW ;Branch if OK›1670 ;›1680 INY ;Increment to next dec. place›1690 INY ›1700 INX ;and increment counter.›1710 CPX #5 ;All done?›1720 BEQ DECOUT ;Yes? Then put it on screen.›1730 ;›1740 BNE SUBTRACT ;No? Subtract next dec. place›1750 ;›1760 DECSTOW›1770 INC DECVAL,X›1780 LDA TEMPLO›1790 STA LOBYTE›1800 LDA TEMPHI›1810 STA HIBYTE›1820 JMP SUBTRACT›1830 DECOUT›1840 LDX #4›1850 LDY #22 ;Pos. on screen.›1860 NXTCH›1870 LDA DECVAL,X ;Get decimal value.›1880 ORA #$90 ;Convert to ATASCII›1890 STA (ZPOINT),Y ;& display it.›1900 DEY ›1910 DEX ›1920 BPL NXTCH ;Do until done.›1930 ;›1940 NODEL›1950 LDA SKCTL ;Check keypress.›1960 CMP #$FF›1970 BEQ RESTOR ;If no keypress›1980 ;›1990 LDA CH›2000 CMP #156 ;Check CTRL-ESC›2010 BEQ EXIT ;If pressed then skip delay.›2020 ;›2030 RESTOR›2040 LDA #$FF ;Restore CH›2050 STA CH›2060 LDY #0 ;Zero timer.›2070 STY 20›2080 DELAY›2090 LDA 20 ;Get timer value.›2100 LSR A ;Divide by 2 for better resolution›2110 CMP TIMVAL›2120 BNE DELAY ;Delay until time is up.›2130 ;›2140 EXIT›2150 PLA ;Give Acc. A back to BASIC›2160 JMP STGO›2170 DECVAL .DS 5›2180 TEMPLO .DS 1›2190 TEMPHI .DS 1›2200 LOBYTE .DS 1›2210 HIBYTE .DS 1›2220 CHECK .DS 1›2230 DLDATA .BYTE $70,$70,$42,$00,$04›2240 DECPLC .WORD 10000,1000,100,10,1›2250 *= $02E0›2260 .WORD STARTCODE›