|
|
Line 4: |
Line 4: |
| 10 P%=&4000:FORV%=0TO3STEP3:[ | | 10 P%=&4000:FORV%=0TO3STEP3:[ |
| 20 OPT V% | | 20 OPT V% |
− | 30 \ Detokenise BASIC tokens
| |
− | 40 \ =======================
| |
− | 50 \ needs, eg tbase=&70 tptr=&72 if calling from BASIC
| |
− | 60 \ eg tbase=&A8 tptr=&AA if calling as a *command
| |
− | 70 \
| |
− | 80 \ ----------------------------------
| |
− | 90 \ TokenInit - Find BASIC token table
| |
− | 100 \ ----------------------------------
| |
− | 110 \ On entry, BASIC ROM must be paged in
| |
− | 120 \ On exit, tbase=>Start of token table
| |
− | 130 \ A,Y,tptr corrupted, X preserved
| |
− | 140 \
| |
− | 150 .TokenInit
| |
− | 160 LDY #0:STY tptr:LDA #&80:STA tptr+1 :\ tptr=>ROM start
| |
− | 170 .TokInitLp
| |
− | 180 LDA #1:CLC:ADC tptr:STA tptr :\ Inc. tptr
| |
− | 190 LDA #0:TAY:ADC tptr+1:STA tptr+1
| |
− | 200LDA(tptr),Y:CMP #&80:BEQ TokInit2:DEY
| |
− | 210 .TokInit2
| |
− | 220 INY:LDA (tptr),Y:CMP #ASC"A":BNE TokInitLp :\ Not "A"
| |
− | 230 INY:LDA (tptr),Y:CMP #ASC"N":BNE TokInitLp :\ Not "AN"
| |
− | 240 INY:LDA (tptr),Y:CMP #ASC"D":BNE TokInitLp :\ Not "AND"
| |
− | 250 .TokInitOk
| |
− | 260 LDA tptr:STA tbase:LDA tptr+1:STA tbase+1
| |
− | 270 RTS
| |
− | 280 :
| |
− | 290 :
| |
− | 300 \ -----------------------------
| |
− | 310 \ PrToken - Print a BASIC token
| |
− | 320 \ -----------------------------
| |
− | 330 \ On entry, A=token byte
| |
− | 340 \ BASIC ROM must be paged in
| |
− | 350 \ tbase=>Start of token table, set by TokenInit
| |
− | 360 \ On exit, A,Y,tptr corrupted, X preserved
| |
− | 370 \
| |
− | 380 .TokenPrint
| |
− | 390 PHA:LDA tbase:STA tptr :\ Point to start token table
| |
− | 400 LDA tbase+1:STA tptr+1
| |
− | 410 .TokPrLp1
| |
− | 420 LDY #&FF
| |
− | 430 .TokPrLp2
| |
− | 440 INY:LDA (tptr),Y:BPL TokPrLp2 :\ Loop until token byte found
| |
− | 450 PLA:CMP (tptr),Y:BEQ TokPrFound :\ Found matching token
| |
− | 460 PHA:TYA:BNE TokPrStep :\ Step to next token
| |
− | 470 .TokPrLp3
| |
− | 480 INY:LDA (tptr),Y:BPL TokPrLp3 :\ Find next token byte
| |
− | 490 DEY:DEY
| |
− | 500 .TokPrStep
| |
− | 510 INY:TYA:SEC:ADC tptr:STA tptr :\ Step past this token string
| |
− | 520 LDA #0:ADC tptr+1:STA tptr+1
| |
− | 530 BNE TokPrLp1 :\ Loop to keep searching
| |
− | 540 .TokPrFound
| |
− | 550 TYA:BEQ TokPrNxt:LDY #0 :\ Skip past leading token
| |
− | 560 .TokPrLp3
| |
− | 570 LDA (tptr),Y:BMI TokPrEnd :\ Token byte, end
| |
− | 580 CMP #32:BCC TokPrEnd:JSR OSWRCH :\ Flag byte, end
| |
− | 590 .TokPrNxt
| |
− | 600 INY:BNE TokPrLp3 :\ Loop back for next character
| |
− | 610 .TokPrEnd
| |
− | 620 RTS
| |
− | 630 ]:NEXT
| |
− | 640 CALL TokenInit
| |
− | 650 FOR A%=&80 TO 255:PRINT ;A%;": ";:CALL TokenPrint:PRINT:NEXT
| |
| </pre> | | </pre> |
| + | -- Lurkio |
| + | |
| + | The ''P%='' needs to be '''inside''' the loop, not outside! :) |
| + | See [http://mdfs.net/Info/Comp/BBC/ProgTips/Detoken DetokenDemo]. |
| + | [[User:Jgharston|Jgharston]] ([[User talk:Jgharston|talk]]) 22:19, 9 March 2015 (UTC) |