10 REM > Detoken 20 : 30 OSWRCH=&FFEE 40 : 50 tbase=&A8:tptr=&AA:REM workspace if running as a *command 60 tbase=&70:tptr=&72:REM workspace if calling from BASIC 70 : 80 DIM mcode% &100 90 FOR P=0 TO 1 100 P%=mcode% 110 [OPT P*3 120 \ ================================== 130 \ TokenInit - Find BASIC token table 140 \ ================================== 150 \ On entry, BASIC ROM must be paged in 160 \ On exit, tbase=>Start of token table 170 \ A,Y,tptr corrupted, X preserved 180 \ In RAM-based code this can be overwritten after being called 190 \ 200 .TokenInit 210 LDY #0:STY tptr:LDA #&80:STA tptr+1 :\ tptr=>ROM start 220 .TokInitLp 230 LDA #1:CLC:ADC tptr:STA tptr :\ Inc. tptr 240 LDA #0:TAY:ADC tptr+1:STA tptr+1 250 LDA (tptr),Y:CMP #&80:BEQ TokInit2:DEY :\ Found &80 260 .TokInit2 270 INY:LDA (tptr),Y:CMP #ASC"A":BNE TokInitLp :\ Not "A" 280 INY:LDA (tptr),Y:CMP #ASC"N":BNE TokInitLp :\ Not "AN" 290 INY:LDA (tptr),Y:CMP #ASC"D":BNE TokInitLp :\ Not "AND" 300 .TokInitOk 310 LDA tptr:STA tbase:LDA tptr+1:STA tbase+1 320 RTS 330 : 340 : 350 \ ============================= 360 \ PrToken - Print a BASIC token 370 \ ============================= 380 \ On entry, A=token byte 390 \ BASIC ROM must be paged in 400 \ tbase=>Start of token table, set by TokenInit 410 \ On exit, A,Y,tptr corrupted, X preserved 420 \ 430 .TokenPrint 440 PHA:LDA tbase:STA tptr :\ Point to start token table 450 LDA tbase+1:STA tptr+1 460 .TokPrLp1 470 LDY #&FF 480 .TokPrLp2 490 INY:LDA (tptr),Y:BPL TokPrLp2 :\ Loop until token byte found 500 PLA:CMP (tptr),Y:BEQ TokPrFound :\ Found matching token 510 PHA:TYA:BNE TokPrStep :\ Step to next token 520 .TokPrLp3 530 INY:LDA (tptr),Y:BPL TokPrLp3 :\ Find next token byte 540 DEY:DEY 550 .TokPrStep 560 INY:TYA:SEC:ADC tptr:STA tptr :\ Step past this token string 570 LDA #0:ADC tptr+1:STA tptr+1 580 BNE TokPrLp1 :\ Loop to keep searching 590 .TokPrFound 600 TYA:BEQ TokPrNxt:LDY #0 :\ Skip past leading token 610 .TokPrLp3 620 LDA (tptr),Y:BMI TokPrEnd :\ Token byte, end 630 CMP #32:BCC TokPrEnd:JSR OSWRCH :\ Flag byte, end 640 .TokPrNxt 650 INY:BNE TokPrLp3 :\ Loop back for next character 660 .TokPrEnd 670 RTS 680 : 690 ]NEXT 700 : 710 REM Test code 720 CALL TokenInit 730 FOR A%=128 TO 255:PRINT;~A%;": ";:CALL TokenPrint:PRINT:NEXT