Classic Computer Magazine Archive PROGRAM LISTING: 86-09/TRACER.M65


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

Back to previous page