separated out token and error tables

This commit is contained in:
Michael Steil 2008-10-13 00:44:36 +00:00
parent c4f4578d97
commit d38b698496
10 changed files with 246 additions and 252 deletions

View File

@ -9,6 +9,7 @@ SEGMENTS {
HEADER: load = BASROM, type = ro;
VECTORS: load = BASROM, type = ro;
KEYWORDS: load = BASROM, type = ro;
ERROR: load = BASROM, type = ro;
CODE: load = BASROM, type = ro;
CHRGET: load = BASROM, type = ro;
INIT: load = BASROM, type = ro;

View File

@ -9,6 +9,7 @@ SEGMENTS {
HEADER: load = BASROM, type = ro;
VECTORS: load = BASROM, type = ro;
KEYWORDS: load = BASROM, type = ro;
ERROR: load = BASROM, type = ro;
CODE: load = BASROM, type = ro;
CHRGET: load = BASROM, type = ro;
INIT: load = BASROM, type = ro;

View File

@ -9,6 +9,7 @@ SEGMENTS {
HEADER: load = BASROM, type = ro;
VECTORS: load = BASROM, type = ro;
KEYWORDS: load = BASROM, type = ro;
ERROR: load = BASROM, type = ro;
CODE: load = BASROM, type = ro;
CHRGET: load = BASROM, type = ro;
INIT: load = BASROM, type = ro;

48
error.s Normal file
View File

@ -0,0 +1,48 @@
init_error_table
.ifdef CONFIG_SMALL
define_error ERR_NOFOR, "NF"
define_error ERR_SYNTAX, "SN"
define_error ERR_NOGOSUB, "RG"
define_error ERR_NODATA, "OD"
define_error ERR_ILLQTY, "FC"
define_error ERR_OVERFLOW, "OV"
define_error ERR_MEMFULL, "OM"
define_error ERR_UNDEFSTAT, "US"
define_error ERR_BADSUBS, "BS"
define_error ERR_REDIMD, "DD"
define_error ERR_ZERODIV, "/0"
define_error ERR_ILLDIR, "ID"
define_error ERR_BADTYPE, "TM"
define_error ERR_STRLONG, "LS"
define_error ERR_FRMCPX, "ST"
define_error ERR_CANTCONT, "CN"
define_error ERR_UNDEFFN, "UF"
.else
define_error ERR_NOFOR, "NEXT WITHOUT FOR"
define_error ERR_SYNTAX, "SYNTAX"
define_error ERR_NOGOSUB, "RETURN WITHOUT GOSUB"
define_error ERR_NODATA, "OUT OF DATA"
define_error ERR_ILLQTY, "ILLEGAL QUANTITY"
.ifdef CBM1
.byte 0,0,0,0,0
.endif
define_error ERR_OVERFLOW, "OVERFLOW"
define_error ERR_MEMFULL, "OUT OF MEMORY"
define_error ERR_UNDEFSTAT, "UNDEF'D STATEMENT"
define_error ERR_BADSUBS, "BAD SUBSCRIPT"
define_error ERR_REDIMD, "REDIM'D ARRAY"
define_error ERR_ZERODIV, "DIVISION BY ZERO"
define_error ERR_ILLDIR, "ILLEGAL DIRECT"
define_error ERR_BADTYPE, "TYPE MISMATCH"
define_error ERR_STRLONG, "STRING TOO LONG"
.ifdef CBM1
define_error ERR_BADDATA, "BAD DATA"
.endif
.ifdef CBM2
define_error ERR_BADDATA, "FILE DATA"
.endif
define_error ERR_FRMCPX, "FORMULA TOO COMPLEX"
define_error ERR_CANTCONT, "CAN'T CONTINUE"
define_error ERR_UNDEFFN, "UNDEF'D FUNCTION"
.endif

View File

@ -9,6 +9,7 @@ SEGMENTS {
HEADER: load = BASROM, type = ro;
VECTORS: load = BASROM, type = ro;
KEYWORDS: load = BASROM, type = ro;
ERROR: load = BASROM, type = ro;
CODE: load = BASROM, type = ro;
CHRGET: load = BASROM, type = ro;
INIT: load = BASROM, type = ro;

View File

@ -9,6 +9,7 @@ SEGMENTS {
HEADER: load = BASROM, type = ro;
VECTORS: load = BASROM, type = ro;
KEYWORDS: load = BASROM, type = ro;
ERROR: load = BASROM, type = ro;
CODE: load = BASROM, type = ro;
CHRGET: load = BASROM, type = ro;
INIT: load = BASROM, type = ro;

View File

@ -57,6 +57,16 @@ DUMMY_START:
NUM_TOKENS := <(*-DUMMY_START)
.endmacro
.macro init_error_table
.segment "ERROR"
ERROR_MESSAGES:
.endmacro
.macro define_error error, msg
.segment "ERROR"
error := <(*-ERROR_MESSAGES)
htasc msg
.endmacro
;---------------------------------------------
; set the MSB of every byte of a string

267
msbasic.s
View File

@ -60,261 +60,12 @@ STACK := $0100
.byte $00,$13,$56
.endif
init_token_tables
.include "token.s"
keyword_rts "END", END
keyword_rts "FOR", FOR
keyword_rts "NEXT", NEXT
keyword_rts "DATA", DATA
.ifdef CONFIG_CBM_ALL
keyword_rts "INPUT#", INPUTH
.endif
keyword_rts "INPUT", INPUT
keyword_rts "DIM", DIM
keyword_rts "READ", READ
.ifdef APPLE
keyword_rts "PLT", PLT
.else
keyword_rts "LET", LET
.endif
keyword_rts "GOTO", GOTO, TOKEN_GOTO
keyword_rts "RUN", RUN
keyword_rts "IF", IF
keyword_rts "RESTORE", RESTORE
keyword_rts "GOSUB", GOSUB, TOKEN_GOSUB
keyword_rts "RETURN", POP
.ifdef APPLE
keyword_rts "TEX", TEX, TOKEN_REM
.else
keyword_rts "REM", REM, TOKEN_REM
.endif
keyword_rts "STOP", STOP
keyword_rts "ON", ON
.ifdef CONFIG_NULL
keyword_rts "NULL", NULL
.endif
.ifdef KBD
keyword_rts "PLOD", PLOD
keyword_rts "PSAV", PSAV
keyword_rts "VLOD", VLOD
keyword_rts "VSAV", VSAV
.else
keyword_rts "WAIT", WAIT
keyword_rts "LOAD", LOAD
keyword_rts "SAVE", SAVE
.endif
.ifdef CONFIG_CBM_ALL
keyword_rts "VERIFY", VERIFY
.endif
keyword_rts "DEF", DEF
.ifdef KBD
keyword_rts "SLOD", SLOD
.else
keyword_rts "POKE", POKE
.endif
.ifdef CONFIG_CBM_ALL
keyword_rts "PRINT#", PRINTH
.endif
keyword_rts "PRINT", PRINT, TOKEN_PRINT
keyword_rts "CONT", CONT
keyword_rts "LIST", LIST
.ifdef CONFIG_CBM_ALL
keyword_rts "CLR", CLEAR
.else
keyword_rts "CLEAR", CLEAR
.endif
.ifdef CONFIG_CBM_ALL
keyword_rts "CMD", CMD
keyword_rts "SYS", SYS
keyword_rts "OPEN", OPEN
keyword_rts "CLOSE", CLOSE
.endif
.ifndef CONFIG_SMALL
keyword_rts "GET", GET
.endif
.ifdef KBD
keyword_rts "PRT", PRT
.endif
keyword_rts "NEW", NEW
.include "error.s"
count_tokens
.segment "CODE"
keyword "TAB(", TOKEN_TAB
keyword "TO", TOKEN_TO
keyword "FN", TOKEN_FN
keyword "SPC(", TOKEN_SPC
keyword "THEN", TOKEN_THEN
keyword "NOT", TOKEN_NOT
keyword "STEP", TOKEN_STEP
keyword "+", TOKEN_PLUS
keyword "-", TOKEN_MINUS
keyword "*"
keyword "/"
.ifdef KBD
keyword "#"
.else
keyword "^"
.endif
keyword "AND"
keyword "OR"
keyword ">", TOKEN_GREATER
keyword "=", TOKEN_EQUAL
keyword "<"
.segment "VECTORS"
UNFNC:
keyword_addr "SGN", SGN, TOKEN_SGN
keyword_addr "INT", INT
keyword_addr "ABS", ABS
.ifdef KBD
keyword_addr "VER", VER
.else
.ifdef KIM
keyword_addr "USR", IQERR
.else
keyword_addr "USR", USR
.endif
.endif
keyword_addr "FRE", FRE
keyword_addr "POS", POS
keyword_addr "SQR", SQR
keyword_addr "RND", RND
keyword_addr "LOG", LOG
keyword_addr "EXP", EXP
keyword_addr "COS", COS
keyword_addr "SIN", SIN
keyword_addr "TAN", TAN
keyword_addr "ATN", ATN
.ifdef KBD
keyword_addr "GETC", GETC
.else
keyword_addr "PEEK", PEEK
.endif
keyword_addr "LEN", LEN
keyword_addr "STR$", STR
keyword_addr "VAL", VAL
keyword_addr "ASC", ASC
keyword_addr "CHR$", CHRSTR
keyword_addr "LEFT$", LEFTSTR, TOKEN_LEFTSTR
keyword_addr "RIGHT$", RIGHTSTR
keyword_addr "MID$", MIDSTR
.ifdef CBM2_KBD
keyword "GO"
.endif
.segment "KEYWORDS"
.byte 0
.segment "VECTORS"
MATHTBL:
.byte $79
.word FADDT-1
.byte $79
.word FSUBT-1
.byte $7B
.word FMULTT-1
.byte $7B
.word FDIVT-1
.byte $7F
.word FPWRT-1
.byte $50
.word TAND-1
.byte $46
.word OR-1
.byte $7D
.word NEGOP-1
.byte $5A
.word EQUOP-1
.byte $64
.word RELOPS-1
.segment "CODE"
ERROR_MESSAGES:
.ifdef CONFIG_SMALL
.define ERRSTR_NOFOR "NF"
.define ERRSTR_SYNTAX "SN"
.define ERRSTR_NOGOSUB "RG"
.define ERRSTR_NODATA "OD"
.define ERRSTR_ILLQTY "FC"
.define ERRSTR_OVERFLOW "OV"
.define ERRSTR_MEMFULL "OM"
.define ERRSTR_UNDEFSTAT "US"
.define ERRSTR_BADSUBS "BS"
.define ERRSTR_REDIMD "DD"
.define ERRSTR_ZERODIV "/0"
.define ERRSTR_ILLDIR "ID"
.define ERRSTR_BADTYPE "TM"
.define ERRSTR_STRLONG "LS"
.define ERRSTR_FRMCPX "ST"
.define ERRSTR_CANTCONT "CN"
.define ERRSTR_UNDEFFN "UF"
.else
.define ERRSTR_NOFOR "NEXT WITHOUT FOR"
.define ERRSTR_SYNTAX "SYNTAX"
.define ERRSTR_NOGOSUB "RETURN WITHOUT GOSUB"
.define ERRSTR_NODATA "OUT OF DATA"
.define ERRSTR_ILLQTY "ILLEGAL QUANTITY"
.define ERRSTR_OVERFLOW "OVERFLOW"
.define ERRSTR_MEMFULL "OUT OF MEMORY"
.define ERRSTR_UNDEFSTAT "UNDEF'D STATEMENT"
.define ERRSTR_BADSUBS "BAD SUBSCRIPT"
.define ERRSTR_REDIMD "REDIM'D ARRAY"
.define ERRSTR_ZERODIV "DIVISION BY ZERO"
.define ERRSTR_ILLDIR "ILLEGAL DIRECT"
.define ERRSTR_BADTYPE "TYPE MISMATCH"
.define ERRSTR_STRLONG "STRING TOO LONG"
.ifdef CBM1
.define ERRSTR_BADDATA "BAD DATA"
.endif
.ifdef CBM2
.define ERRSTR_BADDATA "FILE DATA"
.endif
.define ERRSTR_FRMCPX "FORMULA TOO COMPLEX"
.define ERRSTR_CANTCONT "CAN'T CONTINUE"
.define ERRSTR_UNDEFFN "UNDEF'D FUNCTION"
.endif
ERR_NOFOR := <(*-ERROR_MESSAGES)
htasc ERRSTR_NOFOR
ERR_SYNTAX := <(*-ERROR_MESSAGES)
htasc ERRSTR_SYNTAX
ERR_NOGOSUB := <(*-ERROR_MESSAGES)
htasc ERRSTR_NOGOSUB
ERR_NODATA := <(*-ERROR_MESSAGES)
htasc ERRSTR_NODATA
ERR_ILLQTY := <(*-ERROR_MESSAGES)
htasc ERRSTR_ILLQTY
.ifdef CBM1
.byte 0,0,0,0,0
.endif
ERR_OVERFLOW := <(*-ERROR_MESSAGES)
htasc ERRSTR_OVERFLOW
ERR_MEMFULL := <(*-ERROR_MESSAGES)
htasc ERRSTR_MEMFULL
ERR_UNDEFSTAT := <(*-ERROR_MESSAGES)
htasc ERRSTR_UNDEFSTAT
ERR_BADSUBS := <(*-ERROR_MESSAGES)
htasc ERRSTR_BADSUBS
ERR_REDIMD := <(*-ERROR_MESSAGES)
htasc ERRSTR_REDIMD
ERR_ZERODIV := <(*-ERROR_MESSAGES)
htasc ERRSTR_ZERODIV
ERR_ILLDIR := <(*-ERROR_MESSAGES)
htasc ERRSTR_ILLDIR
ERR_BADTYPE := <(*-ERROR_MESSAGES)
htasc ERRSTR_BADTYPE
ERR_STRLONG := <(*-ERROR_MESSAGES)
htasc ERRSTR_STRLONG
.ifdef CONFIG_CBM_ALL
ERR_BADDATA := <(*-ERROR_MESSAGES)
htasc ERRSTR_BADDATA
.endif
ERR_FRMCPX := <(*-ERROR_MESSAGES)
htasc ERRSTR_FRMCPX
ERR_CANTCONT := <(*-ERROR_MESSAGES)
htasc ERRSTR_CANTCONT
ERR_UNDEFFN := <(*-ERROR_MESSAGES)
htasc ERRSTR_UNDEFFN
QT_ERROR:
.ifdef KBD
.byte " err"
@ -1863,6 +1614,18 @@ L28BE:
sta INDEX
cmp #$19
bcs L28A0
; <<<<<DANGEROUS CODE>>>>>
; NOTE THAT IF (A) = $AB ON THE LINE ABOVE,
; ON.1 WILL COMPARE = AND CAUSE A CATASTROPHIC
; JUMP TO $22D9 (FOR GOTO), OR OTHER LOCATIONS
; FOR OTHER CALLS TO LINGET.
;
; YOU CAN SEE THIS IS YOU FIRST PUT "BRK" IN $22D9,
; THEN TYPE "GO TO 437761".
;
; ANY VALUE FROM 437760 THROUGH 440319 WILL CAUSE
; THE PROBLEM. ($AB00 - $ABFF)
; <<<<<DANGEROUS CODE>>>>>
lda LINNUM
asl a
rol INDEX

View File

@ -9,6 +9,7 @@ SEGMENTS {
HEADER: load = BASROM, type = ro;
VECTORS: load = BASROM, type = ro;
KEYWORDS: load = BASROM, type = ro;
ERROR: load = BASROM, type = ro;
CODE: load = BASROM, type = ro;
CHRGET: load = BASROM, type = ro;
INIT: load = BASROM, type = ro;

167
token.s Normal file
View File

@ -0,0 +1,167 @@
init_token_tables
keyword_rts "END", END
keyword_rts "FOR", FOR
keyword_rts "NEXT", NEXT
keyword_rts "DATA", DATA
.ifdef CONFIG_CBM_ALL
keyword_rts "INPUT#", INPUTH
.endif
keyword_rts "INPUT", INPUT
keyword_rts "DIM", DIM
keyword_rts "READ", READ
.ifdef APPLE
keyword_rts "PLT", PLT
.else
keyword_rts "LET", LET
.endif
keyword_rts "GOTO", GOTO, TOKEN_GOTO
keyword_rts "RUN", RUN
keyword_rts "IF", IF
keyword_rts "RESTORE", RESTORE
keyword_rts "GOSUB", GOSUB, TOKEN_GOSUB
keyword_rts "RETURN", POP
.ifdef APPLE
keyword_rts "TEX", TEX, TOKEN_REM
.else
keyword_rts "REM", REM, TOKEN_REM
.endif
keyword_rts "STOP", STOP
keyword_rts "ON", ON
.ifdef CONFIG_NULL
keyword_rts "NULL", NULL
.endif
.ifdef KBD
keyword_rts "PLOD", PLOD
keyword_rts "PSAV", PSAV
keyword_rts "VLOD", VLOD
keyword_rts "VSAV", VSAV
.else
keyword_rts "WAIT", WAIT
keyword_rts "LOAD", LOAD
keyword_rts "SAVE", SAVE
.endif
.ifdef CONFIG_CBM_ALL
keyword_rts "VERIFY", VERIFY
.endif
keyword_rts "DEF", DEF
.ifdef KBD
keyword_rts "SLOD", SLOD
.else
keyword_rts "POKE", POKE
.endif
.ifdef CONFIG_CBM_ALL
keyword_rts "PRINT#", PRINTH
.endif
keyword_rts "PRINT", PRINT, TOKEN_PRINT
keyword_rts "CONT", CONT
keyword_rts "LIST", LIST
.ifdef CONFIG_CBM_ALL
keyword_rts "CLR", CLEAR
.else
keyword_rts "CLEAR", CLEAR
.endif
.ifdef CONFIG_CBM_ALL
keyword_rts "CMD", CMD
keyword_rts "SYS", SYS
keyword_rts "OPEN", OPEN
keyword_rts "CLOSE", CLOSE
.endif
.ifndef CONFIG_SMALL
keyword_rts "GET", GET
.endif
.ifdef KBD
keyword_rts "PRT", PRT
.endif
keyword_rts "NEW", NEW
count_tokens
keyword "TAB(", TOKEN_TAB
keyword "TO", TOKEN_TO
keyword "FN", TOKEN_FN
keyword "SPC(", TOKEN_SPC
keyword "THEN", TOKEN_THEN
keyword "NOT", TOKEN_NOT
keyword "STEP", TOKEN_STEP
keyword "+", TOKEN_PLUS
keyword "-", TOKEN_MINUS
keyword "*"
keyword "/"
.ifdef KBD
keyword "#"
.else
keyword "^"
.endif
keyword "AND"
keyword "OR"
keyword ">", TOKEN_GREATER
keyword "=", TOKEN_EQUAL
keyword "<"
.segment "VECTORS"
UNFNC:
keyword_addr "SGN", SGN, TOKEN_SGN
keyword_addr "INT", INT
keyword_addr "ABS", ABS
.ifdef KBD
keyword_addr "VER", VER
.else
.ifdef KIM
keyword_addr "USR", IQERR
.else
keyword_addr "USR", USR
.endif
.endif
keyword_addr "FRE", FRE
keyword_addr "POS", POS
keyword_addr "SQR", SQR
keyword_addr "RND", RND
keyword_addr "LOG", LOG
keyword_addr "EXP", EXP
keyword_addr "COS", COS
keyword_addr "SIN", SIN
keyword_addr "TAN", TAN
keyword_addr "ATN", ATN
.ifdef KBD
keyword_addr "GETC", GETC
.else
keyword_addr "PEEK", PEEK
.endif
keyword_addr "LEN", LEN
keyword_addr "STR$", STR
keyword_addr "VAL", VAL
keyword_addr "ASC", ASC
keyword_addr "CHR$", CHRSTR
keyword_addr "LEFT$", LEFTSTR, TOKEN_LEFTSTR
keyword_addr "RIGHT$", RIGHTSTR
keyword_addr "MID$", MIDSTR
.ifdef CBM2_KBD
keyword "GO"
.endif
.segment "KEYWORDS"
.byte 0
.segment "VECTORS"
MATHTBL:
.byte $79
.word FADDT-1
.byte $79
.word FSUBT-1
.byte $7B
.word FMULTT-1
.byte $7B
.word FDIVT-1
.byte $7F
.word FPWRT-1
.byte $50
.word TAND-1
.byte $46
.word OR-1
.byte $7D
.word NEGOP-1
.byte $5A
.word EQUOP-1
.byte $64
.word RELOPS-1