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 ;Set ZP-pointer                        to start›0330     STA SRCPNT  ;address of move.›0340     LDA # >SOURCE›0350     STA SRCPNT+1›0360     LDA # <DESTIN ;Set another                           pointer to›0370     STA DESPNT  ;end address.›0380     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 ;Put a vector                          in BASIC›0720     STA $A978   ;which points to                       our routine.›0730     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›