diff --git a/applesoft.cfg b/applesoft.cfg index ed4d8bb..d05a25d 100644 --- a/applesoft.cfg +++ b/applesoft.cfg @@ -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; diff --git a/cbmbasic1.cfg b/cbmbasic1.cfg index dcfa88b..7d6eb7b 100644 --- a/cbmbasic1.cfg +++ b/cbmbasic1.cfg @@ -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; diff --git a/cbmbasic2.cfg b/cbmbasic2.cfg index dcfa88b..7d6eb7b 100644 --- a/cbmbasic2.cfg +++ b/cbmbasic2.cfg @@ -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; diff --git a/error.s b/error.s new file mode 100644 index 0000000..8b813b2 --- /dev/null +++ b/error.s @@ -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 \ No newline at end of file diff --git a/kb9.cfg b/kb9.cfg index b14cd5b..8776a08 100644 --- a/kb9.cfg +++ b/kb9.cfg @@ -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; diff --git a/kbdbasic.cfg b/kbdbasic.cfg index b2a68bd..f64810c 100644 --- a/kbdbasic.cfg +++ b/kbdbasic.cfg @@ -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; diff --git a/macros.s b/macros.s index 68a390c..33f1ca0 100644 --- a/macros.s +++ b/macros.s @@ -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 diff --git a/msbasic.s b/msbasic.s index 5b85691..4dc4965 100644 --- a/msbasic.s +++ b/msbasic.s @@ -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 +; <<<<>>>> +; 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) +; <<<<>>>> lda LINNUM asl a rol INDEX diff --git a/osi.cfg b/osi.cfg index e4a9912..936f747 100644 --- a/osi.cfg +++ b/osi.cfg @@ -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; diff --git a/token.s b/token.s new file mode 100644 index 0000000..e361460 --- /dev/null +++ b/token.s @@ -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