Difference between revisions of "Talk:Detokenising in 6502 machine code"

From BeebWiki
Jump to: navigation, search
(Can't get code to run)
 
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)

Revision as of 23:19, 9 March 2015

I tried to make a listing (below) out of the code and run it in BeebEm, but it just prints out "128: AND" and then hangs. What am I doing wrong? Apologies if it's something incredibly obvious.

5 tbase=&70:tptr=&72:OSWRCH=&FFEE
10 P%=&4000:FORV%=0TO3STEP3:[
20 OPT V%

-- Lurkio

The P%= needs to be inside the loop, not outside! :) See DetokenDemo. Jgharston (talk) 22:19, 9 March 2015 (UTC)