# HG changeset patch # User William Astle # Date 1704865631 25200 # Node ID 527212870064cc8e4d7a5ee400dddce28b9080cf # Parent ac183a519439fedf0844e54dcf7d57d1287e62d4 Add parsing routines for bare commands and REM statements diff -r ac183a519439 -r 527212870064 src/parse.s --- a/src/parse.s Mon Jan 08 22:58:08 2024 -0700 +++ b/src/parse.s Tue Jan 09 22:47:11 2024 -0700 @@ -31,6 +31,8 @@ ldu parse_tokenst ; get start location we started parsing the token at rts ; return error condition parse0 ldx #parsetab_cmd ; point to jump table for token type handler + cmpb #token_stmtsep ; is it a statement separator? + beq parse_nextstmt ; brif so - we can just skip it parse1 cmpb ,x ; did we match a valid command token? beq parse3 ; brif so leax 3,x ; move to next entry @@ -40,7 +42,7 @@ bra parse_error ; and return the error parse3 jsr [1,x] ; call the handler bcs parse_error ; brif the handler indicated error - jsr parse_curtoken ; get the token we terminated on + bsr parse_curtoken ; fetch the token we left off on cmpb #token_eot ; end of input? bne parse4 ; brif not ldb #bc_eol ; stash an end of line op @@ -134,6 +136,17 @@ parse_toupper0 rts ; Z only set here if input was zero entering from parse_nextcharu parse_number jmp parse_tokerr ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Parse a statement that consists of just the command token +parse_cmdsingle equ parse_write ; just write the token out and bail +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Parse a REM or ' statement. We just copy the comment out after the REM or ' token. +parse_rem jsr parse_write ; write the token/character out + ldb ,y+ ; get next input character + bne parse_rem ; brif not at the end of the input + ldb #token_eot ; flag end of input for mainline parser + stb parse_curtok + rts ; return, pass back the C result from parse_write +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; This routine parses tokens using the table at parse_wordtab. The table is structured as follows: ; ; * two bytes which contain the length of the table less the two bytes for this length value @@ -340,18 +353,18 @@ parse_tokendefp sub ; SUB parse_tokendefp as ; AS - parse_tokendefc remabbr,parse_noop,list_noop,exec_noop ; abbreviated REM (') - parse_tokendefc rem,parse_noop,list_noop,exec_noop ; REM - parse_tokendefc return,parse_noop,parse_noop,parse_noop ; RETURN + parse_tokendefc remabbr,parse_rem,list_noop,exec_noop ; abbreviated REM (') + parse_tokendefc rem,parse_rem,list_noop,exec_noop ; REM + parse_tokendefc return,parse_cmdsingle,parse_noop,parse_noop ; RETURN parse_tokendefc run,parse_noop,parse_noop,parse_noop ; RUN parse_tokendefc data,parse_noop,parse_noop,parse_noop ; DATA - parse_tokendefc end,parse_noop,parse_noop,parse_noop ; END - parse_tokendefc stop,parse_noop,parse_noop,parse_noop ; STOP + parse_tokendefc end,parse_cmdsingle,parse_noop,parse_noop ; END + parse_tokendefc stop,parse_cmdsingle,parse_noop,parse_noop ; STOP parse_tokendefc let,parse_noop,parse_noop,parse_noop ; LET parse_tokendefc list,parse_noop,parse_noop,parse_noop ; LIST - parse_tokendefc new,parse_noop,parse_noop,parse_noop ; NEW + parse_tokendefc new,parse_cmdsingle,parse_noop,parse_noop ; NEW parse_tokendefc print,parse_noop,parse_noop,parse_noop ; PRINT - parse_tokendefc pop,parse_noop,parse_noop,parse_noop ; POP + parse_tokendefc pop,parse_cmdsingle,parse_noop,parse_noop ; POP parse_tokendefc goto,parse_noop,parse_noop,parse_noop ; GOTO parse_tokendefc gosub,parse_noop,parse_noop,parse_noop ; GOSUB parse_tokendefc go,parse_noop,parse_noop,parse_noop ; GO