1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-10-18 07:24:16 +00:00

Clean up dictionary and add a few minor ops

This commit is contained in:
David Schmenk 2023-12-29 10:07:58 -08:00
parent 64b516f810
commit 7ce2ab726c
5 changed files with 219 additions and 142 deletions

View File

@ -202,6 +202,7 @@ cp samplesrc/lz4cat.pla prodos/bld/samples/LZ4CAT.PLA.TXT
cp samplesrc/sfm.pla prodos/bld/samples/SFM.PLA.TXT cp samplesrc/sfm.pla prodos/bld/samples/SFM.PLA.TXT
cp samplesrc/sfmsprt.pla prodos/bld/samples/SFMSPRT.PLA.TXT cp samplesrc/sfmsprt.pla prodos/bld/samples/SFMSPRT.PLA.TXT
cp samplesrc/fppow.pla prodos/bld/samples/FPPOW.PLA.TXT cp samplesrc/fppow.pla prodos/bld/samples/FPPOW.PLA.TXT
cp samplesrc/cmdsys.4th prodos/bld/samples/CMDSYS.4TH.TXT
cp samplesrc/bounce.4th prodos/bld/samples/BOUNCE.4TH.TXT cp samplesrc/bounce.4th prodos/bld/samples/BOUNCE.4TH.TXT
cp utilsrc/apple/mon.pla prodos/bld/samples/MON.PLA.TXT cp utilsrc/apple/mon.pla prodos/bld/samples/MON.PLA.TXT
cp utilsrc/apple/zipchip.pla prodos/bld/samples/ZIPCHIP.PLA.TXT cp utilsrc/apple/zipchip.pla prodos/bld/samples/ZIPCHIP.PLA.TXT

View File

@ -1,6 +1,5 @@
: IFACE 2 * + @ ; SRC" CMDSYS.4TH"
LOOKUP CMDSYS 3 IFACE PLASMA EXECMOD
" CONIO" EXECMOD " CONIO" EXECMOD
." Load module returns " . CR ." Load module returns " . CR

6
src/samplesrc/cmdsys.4th Normal file
View File

@ -0,0 +1,6 @@
: IFACE 2 * + @ ;
LOOKUP CMDSYS 3 IFACE PLASMA EXECMOD
LOOKUP CMDSYS 3 IFACE PLASMA CMDLINE
LOOKUP STRCPY PLASMA STRCPY
LOOKUP STRCAT PLASMA STRCAT

View File

@ -31,7 +31,8 @@ const hidden_flag = $80
predef _drop_(a)#0, _swap_(a,b)#2, _dup_(a)#2, _dashdup_(a)#1, _over_(a,b,c)#4, _rot_(a,b,c)#3 predef _drop_(a)#0, _swap_(a,b)#2, _dup_(a)#2, _dashdup_(a)#1, _over_(a,b,c)#4, _rot_(a,b,c)#3
predef _add_(a,b)#1, _inc_(a)#1, _inc2_(a)#1, _sub_(a,b)#1, _mul_(a,b)#1, _div_(a,b)#1 predef _add_(a,b)#1, _inc_(a)#1, _inc2_(a)#1, _sub_(a,b)#1, _mul_(a,b)#1, _div_(a,b)#1
predef _neg_(a)#1, _and_(a,b)#1, _or_(a,b)#1, _xor_(a,b)#1, _not_(a)#1 predef _neg_(a)#1, _and_(a,b)#1, _or_(a,b)#1, _xor_(a,b)#1, _not_(a)#1
predef _abs_(a)#1, _max_(a,b)#1, _min_(a,b)#1 predef _mod_(a,b)#1, _abs_(a)#1, _max_(a,b)#1, _min_(a,b)#1
predef _lshift_(a,b)#1, _rshift_(a,b)#1
predef _cset_(a,b)#0, _cget_(a)#1, _wset_(a,b)#0, _wplusset_(a,b)#0, _wget_(a)#1 predef _cset_(a,b)#0, _cget_(a)#1, _wset_(a,b)#0, _wplusset_(a,b)#0, _wget_(a)#1
predef _ffa_(a)#1, _lfa_(a)#1, _cfa_(a)#1, _pfa_(a)#1, _allot_(a)#0 predef _ffa_(a)#1, _lfa_(a)#1, _cfa_(a)#1, _pfa_(a)#1, _allot_(a)#0
predef _eq_(a,b)#1, _gt_(a,b)#1, _lt_(a,b)#1, _0lt_(a)#1, _0eq_(a)#1 predef _eq_(a,b)#1, _gt_(a,b)#1, _lt_(a,b)#1, _0lt_(a)#1, _0eq_(a)#1
@ -47,7 +48,7 @@ predef _var_(a)#0, _const_(a)#0, _lit_#1, _slit_#1, _tick_#1, _forget_#0
predef _terminal_#1, _prat_(a)#0, _str_#0, _prstr_#0, _src_#0 predef _terminal_#1, _prat_(a)#0, _str_#0, _prstr_#0, _src_#0
predef _vlist_#0, _tron_#0, _troff_#0, _itc_#0, _pbc_#0 predef _vlist_#0, _tron_#0, _troff_#0, _itc_#0, _pbc_#0
predef _brkout_#0, _brkon_#0, _brkoff_#0 predef _brkout_#0, _brkon_#0, _brkoff_#0
predef _show_#0, _showstack_#0, _showrstack_#0 predef _space_#0, _spaces_(a)#0, _show_#0, _showstack_#0, _showrstack_#0
predef _cont_#0, _restart_#0, _bye_#0, _quit_#0, _abort_#0 predef _cont_#0, _restart_#0, _bye_#0, _quit_#0, _abort_#0
// DROP // DROP
char d_drop = "DROP" char d_drop = "DROP"
@ -56,7 +57,7 @@ word = 0, @_drop_, $30
// SWAP // SWAP
char d_swap = "SWAP" char d_swap = "SWAP"
byte = 0 byte = 0
word = @d_drop, @_swap_, 0 word = @d_drop, @_swap_
// DUP // DUP
char d_dup = "DUP" char d_dup = "DUP"
byte = inline_flag byte = inline_flag
@ -64,15 +65,15 @@ word = @d_swap, @_dup_, $34
// -DUP // -DUP
char d_dashdup = "-DUP" char d_dashdup = "-DUP"
byte = 0 byte = 0
word = @d_dup, @_dashdup_, 0 word = @d_dup, @_dashdup_
// OVER // OVER
word d_over = "OVER" word d_over = "OVER"
byte = 0 byte = 0
word = @d_dashdup, @_over_, 0 word = @d_dashdup, @_over_
// ROT // ROT
word d_rot = "ROT" word d_rot = "ROT"
byte = 0 byte = 0
word = @d_over, @_rot_, 0 word = @d_over, @_rot_
// ADD // ADD
char d_add = "+" char d_add = "+"
byte = inline_flag byte = inline_flag
@ -97,10 +98,18 @@ word = @d_sub, @_mul_, $86
char d_div = "/" char d_div = "/"
byte = inline_flag byte = inline_flag
word = @d_mul, @_div_, $88 word = @d_mul, @_div_, $88
// DIVMOD
char d_divmod = "/MOD"
byte = inline_flag
word = @d_div, @divmod, $36
// MOD
char d_mod = "MOD"
byte = inline_flag
word = @d_divmod, @_mod_, $8A
// NEG // NEG
char d_neg = "NEG" char d_neg = "NEG"
byte = inline_flag byte = inline_flag
word = @d_div, @_neg_, $90 word = @d_mod, @_neg_, $90
// AND // AND
char d_and = "AND" char d_and = "AND"
byte = inline_flag byte = inline_flag
@ -117,10 +126,18 @@ word = @d_or, @_xor_, $98
char d_not = "NOT" char d_not = "NOT"
byte = inline_flag byte = inline_flag
word = @d_xor, @_not_, $92 word = @d_xor, @_not_, $92
// LEFT SHIFT
char d_lshift = "LSHIFT"
byte = inline_flag
word = @d_not, @_lshift_, $9A
// RIGHT SHIFT
char d_rshift = "RSHIFT"
byte = inline_flag
word = @d_lshift, @_rshift_, $9C
// EQUALS // EQUALS
char d_eq = "=" char d_eq = "="
byte = inline_flag byte = inline_flag
word = @d_not, @_eq_, $40 word = @d_rshift, @_eq_, $40
// GREATER THAN // GREATER THAN
char d_gt = ">" char d_gt = ">"
byte = inline_flag byte = inline_flag
@ -140,15 +157,15 @@ word = @d_0lt, @_0eq_, $4000 // ZERO ISEQ
// ABS // ABS
char d_abs = "ABS" char d_abs = "ABS"
byte = 0 byte = 0
word = @d_0eq, @_abs_, 0 word = @d_0eq, @_abs_
// MIN // MIN
char d_min = "MIN" char d_min = "MIN"
byte = 0 byte = 0
word = @d_abs, @_min_, 0 word = @d_abs, @_min_
// MAX // MAX
char d_max = "MAX" char d_max = "MAX"
byte = 0 byte = 0
word = @d_min, @_max_, 0 word = @d_min, @_max_
// CHAR PUT // CHAR PUT
char d_cset = "C!" char d_cset = "C!"
byte = inline_flag byte = inline_flag
@ -160,7 +177,7 @@ word = @d_cset, @_wset_, $72
// WORD PLUS PUT // WORD PLUS PUT
char d_wplusset = "+!" char d_wplusset = "+!"
byte = 0 byte = 0
word = @d_wset, @_wplusset_, 0 word = @d_wset, @_wplusset_
// CHAR GET // CHAR GET
char d_cget = "C@" char d_cget = "C@"
byte = inline_flag byte = inline_flag
@ -176,316 +193,328 @@ word = @d_wget, @_execute_, $56 // ICAL
// TO RSTACK // TO RSTACK
char d_torstk = ">R" char d_torstk = ">R"
byte = 0 byte = 0
word = @d_execute, @_tors_, 0 word = @d_execute, @_tors_
// FROM RSTACK // FROM RSTACK
char d_fromrstk = "R>" char d_fromrstk = "R>"
byte = 0 byte = 0
word = @d_torstk, @_fromrs_, 0 word = @d_torstk, @_fromrs_
// TOP OF RSTACK // TOP OF RSTACK
char d_toprstk = "R@" char d_toprstk = "R@"
byte = 0 byte = 0
word = @d_fromrstk, @_toprs_, 0 word = @d_fromrstk, @_toprs_
// PLASMA SYMBOL LOOKUP // PLASMA SYMBOL LOOKUP
char d_lookup = "LOOKUP" char d_lookup = "LOOKUP"
byte = imm_flag byte = imm_flag
word = @d_toprstk, @_lookup_, 0 word = @d_toprstk, @_lookup_
// PLASMA LINKEAGE // PLASMA LINKEAGE
char d_plasma = "PLASMA" char d_plasma = "PLASMA"
byte = 0 byte = 0
word = @d_lookup, @_plasma_, 0 word = @d_lookup, @_plasma_
// VARIABLE // VARIABLE
char d_var = "VARIABLE" char d_var = "VARIABLE"
byte = 0 byte = 0
word = @d_plasma, @_var_, 0 word = @d_plasma, @_var_
// CONSTANT // CONSTANT
char d_const = "CONSTANT" char d_const = "CONSTANT"
byte = 0 byte = 0
word = @d_var, @_const_, 0 word = @d_var, @_const_
// CMOVE // CMOVE
char d_cmove = "CMOVE" char d_cmove = "CMOVE"
byte = 0 byte = 0
word = @d_const, @_cmove_, 0 word = @d_const, @_cmove_
// MOVE // MOVE
char d_move = "MOVE" char d_move = "MOVE"
byte = 0 byte = 0
word = @d_cmove, @_move_, 0 word = @d_cmove, @_move_
// FILL // FILL
char d_fill = "FILL" char d_fill = "FILL"
byte = 0 byte = 0
word = @d_move, @_fill_, 0 word = @d_move, @_fill_
// HERE // HERE
char d_here = "HERE" char d_here = "HERE"
byte = 0 byte = 0
word = @d_fill, @heapmark, 0 word = @d_fill, @heapmark
// ALLOT // ALLOT
char d_allot = "ALLOT" char d_allot = "ALLOT"
byte = 0 byte = 0
word = @d_here, @_allot_, 0 word = @d_here, @_allot_
// BRANCH // BRANCH
char d_branch = "(BRANCH)" char d_branch = "(BRANCH)"
byte = param_flag byte = componly_flag | param_flag
word = @d_allot, @_branch_, 0 word = @d_allot, @_branch_
// BRANCH IF 0 // BRANCH IF 0
char d_0branch = "(0BRANCH)" char d_0branch = "(0BRANCH)"
byte = param_flag byte = componly_flag | param_flag
word = @d_branch, @_0branch_, 0 word = @d_branch, @_0branch_
// IF // IF
char d_if = "IF" char d_if = "IF"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_0branch, @_if_, 0 word = @d_0branch, @_if_
// ELSE // ELSE
char d_else = "ELSE" char d_else = "ELSE"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_if, @_else_, 0 word = @d_if, @_else_
// THEN // THEN
char d_then = "THEN" char d_then = "THEN"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_else, @_then_, 0 word = @d_else, @_then_
// CASE // CASE
char d_case = "CASE" char d_case = "CASE"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_then, @_case_, 0 word = @d_then, @_case_
// OF // OF
char d_of = "OF" char d_of = "OF"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_case, @_of_, 0 word = @d_case, @_of_
// ENDOF // ENDOF
char d_endof = "ENDOF" char d_endof = "ENDOF"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_of, @_endof_, 0 word = @d_of, @_endof_
// ENDCASE // ENDCASE
char d_endcase = "ENDCASE" char d_endcase = "ENDCASE"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_endof, @_endcase_, 0 word = @d_endof, @_endcase_
// DO // DO
char d_do = "DO" char d_do = "DO"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_endcase, @_do_, 0 word = @d_endcase, @_do_
// LEAVE // LEAVE
char d_leave = "LEAVE" char d_leave = "LEAVE"
byte = componly_flag byte = componly_flag
word = @d_do, @_leave_, 0 word = @d_do, @_leave_
// COMPILED LOOP // COMPILED LOOP
char d_doloop = "(DOLOOP)" char d_doloop = "(DOLOOP)"
byte = param_flag byte = componly_flag | param_flag
word = @d_leave, @_doloop_, 0 word = @d_leave, @_doloop_
// LOOP // LOOP
char d_loop = "LOOP" char d_loop = "LOOP"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_doloop, @_loop_, 0 word = @d_doloop, @_loop_
// COMPILED LOOP+ // COMPILED LOOP+
char d_doplusloop = "(+DOLOOP)" char d_doplusloop = "(+DOLOOP)"
byte = param_flag byte = componly_flag | param_flag
word = @d_loop, @_doplusloop_, 0 word = @d_loop, @_doplusloop_
// LOOP // LOOP
char d_plusloop = "+LOOP" char d_plusloop = "+LOOP"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_doplusloop, @_plusloop_, 0 word = @d_doplusloop, @_plusloop_
// I // I
char d_i = "I" char d_i = "I"
byte = componly_flag byte = componly_flag
word = @d_plusloop, @_toprs_, 0 word = @d_plusloop, @_toprs_
// J // J
char d_j = "J" char d_j = "J"
byte = componly_flag byte = componly_flag
word = @d_i, @_j_, 0 word = @d_i, @_j_
// BEGIN // BEGIN
char d_begin = "BEGIN" char d_begin = "BEGIN"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_j, @_begin_, 0 word = @d_j, @_begin_
// AGAIN // AGAIN
char d_again = "AGAIN" char d_again = "AGAIN"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_begin, @_again_, 0 word = @d_begin, @_again_
// UNTIL // UNTIL
char d_until = "UNTIL" char d_until = "UNTIL"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_again, @_until_, 0 word = @d_again, @_until_
// WHILE // WHILE
char d_while = "WHILE" char d_while = "WHILE"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_until, @_while_, 0 word = @d_until, @_while_
// REPEAT // REPEAT
char d_repeat = "REPEAT" char d_repeat = "REPEAT"
byte = componly_flag | imm_flag byte = imm_flag
word = @d_while, @_repeat_, 0 word = @d_while, @_repeat_
// FORGET // FORGET
char d_forget = "FORGET" char d_forget = "FORGET"
byte = 0 byte = 0
word = @d_repeat, @_forget_, 0 word = @d_repeat, @_forget_
// CREATE // CREATE
char d_create = "CREATE" char d_create = "CREATE"
byte = imm_flag byte = imm_flag
word = @d_forget, @_buildcreate_, 0 word = @d_forget, @_buildcreate_
// BUILDS // BUILDS
char d_builds = "<BUILDS" char d_builds = "<BUILDS"
byte = imm_flag byte = imm_flag
word = @d_create, @_builds_, 0 word = @d_create, @_builds_
// FILL DOES COMPILE TIME // FILL DOES COMPILE TIME
char d_filldoes = "(FILLDOES)" char d_filldoes = "(FILLDOES)"
byte = 0 byte = componly_flag
word = @d_builds, @_filldoes_, 0 word = @d_builds, @_filldoes_
// DO DOES RUN TIME // DO DOES RUN TIME
char d_dodoes = "(DODOES)" char d_dodoes = "(DODOES)"
byte = 0 byte = componly_flag
word = @d_filldoes, @_dodoes_, 0 word = @d_filldoes, @_dodoes_
// DOES // DOES
char d_does = "DOES>" char d_does = "DOES>"
byte = imm_flag byte = imm_flag
word = @d_dodoes, @_does_, 0 word = @d_dodoes, @_does_
// COMMA // COMMA
char d_comma = "," char d_comma = ","
byte = 0 byte = 0
word = @d_does, @pfillw, 0 word = @d_does, @pfillw
// COMMA // COMMA
char d_commab = "C," char d_commab = "C,"
byte = 0 byte = 0
word = @d_comma, @pfillb, 0 word = @d_comma, @pfillb
// COLON // COLON
char d_colon = ":" char d_colon = ":"
byte = 0 byte = 0
word = @d_commab, @_colon_, 0 word = @d_commab, @_colon_
// SEMI // SEMI
char d_semi = ";" char d_semi = ";"
byte = imm_flag byte = imm_flag
word = @d_colon, @_semi_, 0 word = @d_colon, @_semi_
// TICK // TICK
char d_tick = "'" char d_tick = "'"
byte = 0 byte = 0
word = @d_semi, @_tick_, 0 word = @d_semi, @_tick_
// LITERAL NUMBER // LITERAL NUMBER
char d_lit = "LIT" char d_lit = "LIT"
byte = param_flag byte = param_flag
word = @d_tick, @_lit_, 0 word = @d_tick, @_lit_
// ?TERMINAL // ?TERMINAL
char d_terminal = "?TERMINAL" char d_terminal = "?TERMINAL"
byte = 0 byte = 0
word = @d_lit, @_terminal_, 0 word = @d_lit, @_terminal_
// KEY // KEY
char d_key = "KEY" char d_key = "KEY"
byte = 0 byte = 0
word = @d_terminal, @getc, 0 word = @d_terminal, @getc
// PRINT @TOS // PRINT @TOS
char d_prat = "?" char d_prat = "?"
byte = 0 byte = 0
word = @d_key, @_prat_, 0 word = @d_key, @_prat_
// PRINT TOS // PRINT TOS
char d_prtos = "." char d_prtos = "."
byte = 0 byte = 0
word = @d_prat, @puti, 0 word = @d_prat, @puti
// PRINT TOS HEX // PRINT TOS HEX
char d_prtoshex = ".$" char d_prtoshex = ".$"
byte = 0 byte = 0
word = @d_prtos, @puth, 0 word = @d_prtos, @puth
// PRINT TOS HEX // PRINT TOS HEX
char d_prtosbyte = ".C$" char d_prtosbyte = ".C$"
byte = 0 byte = 0
word = @d_prtoshex, @putb, 0 word = @d_prtoshex, @putb
// EMIT // EMIT
char d_emit = "EMIT" char d_emit = "EMIT"
byte = 0 byte = 0
word = @d_prtosbyte, @putc, 0 word = @d_prtosbyte, @putc
// CR // CR
char d_cr = "CR" char d_cr = "CR"
byte = 0 byte = 0
word = @d_emit, @putln, 0 word = @d_emit, @putln
// SPACE
char d_space = "SPACE"
byte = 0
word = @d_cr, @_space_
// SPACES
char d_spaces = "SPACES"
byte = 0
word = @d_space, @_spaces_
// STRING // STRING
char d_str = "\"" char d_str = "\""
byte = imm_flag byte = imm_flag
word = @d_cr, @_str_, 0 word = @d_spaces, @_str_
// LITERAL STRING // LITERAL STRING
char d_slit = "SLIT" char d_slit = "SLIT"
byte = param_flag byte = param_flag
word = @d_str, @_slit_, 0 word = @d_str, @_slit_
// COMPILED PRINT STRING // COMPILED PRINT STRING
char d_doprstr = "(.\")" char d_doprstr = "(.\")"
byte = 0 byte = 0
word = @d_slit, @puts, 0 word = @d_slit, @puts
// PRINT STRING // PRINT STRING
char d_prstr = ".\"" char d_prstr = ".\""
byte = imm_flag byte = imm_flag
word = @d_doprstr, @_prstr_, 0 word = @d_doprstr, @_prstr_
// SOURCE FILE // SOURCE FILE
char d_prsrc = "SRC\"" char d_prsrc = "SRC\""
byte = 0 byte = 0
word = @d_prstr, @_src_, 0 word = @d_prstr, @_src_
// CONT // CONT
char d_cont = "CONT" char d_cont = "CONT"
byte = 0 byte = 0
word = @d_prsrc, @_cont_, 0 word = @d_prsrc, @_cont_
// QUIT // QUIT
char d_quit = "QUIT" char d_quit = "QUIT"
byte = 0 byte = 0
word = @d_cont, @_quit_, 0 word = @d_cont, @_quit_
// ABORT // ABORT
char d_abort = "ABORT" char d_abort = "ABORT"
byte = 0 byte = 0
word = @d_quit, @_abort_, 0 word = @d_quit, @_abort_
// RESTART // RESTART
char d_restart = "RESTART" char d_restart = "RESTART"
byte = 0 byte = 0
word = @d_abort, @_restart_, 0 word = @d_abort, @_restart_
// BYE // BYE
char d_bye = "BYE" char d_bye = "BYE"
byte = 0 byte = 0
word = @d_restart, @_bye_, 0 word = @d_restart, @_bye_
// CALL 6502 // CALL 6502
char d_call = "CALL" char d_call = "CALL"
byte = 0 byte = 0
word = @d_bye, @call, 0 word = @d_bye, @call
// SHOW DEFINITION // SHOW DEFINITION
char d_show = "SHOW" char d_show = "SHOW"
byte = 0 byte = 0
word = @d_call, @_show_, 0 word = @d_call, @_show_
// SHOW STACK // SHOW STACK
char d_showstack = "SHOWSTACK" char d_showstack = "SHOWSTACK"
byte = 0 byte = 0
word = @d_show, @_showstack_, 0 word = @d_show, @_showstack_
// SHOW RSTACK // SHOW RSTACK
char d_showrstack = "SHOWRSTACK" char d_showrstack = "SHOWRSTACK"
byte = 0 byte = 0
word = @d_showstack, @_showrstack_, 0 word = @d_showstack, @_showrstack_
// TRACE ON // TRACE ON
char d_tron = "TRON" char d_tron = "TRON"
byte = 0 byte = 0
word = @d_showrstack, @_tron_, 0 word = @d_showrstack, @_tron_
// TRACE OFF // TRACE OFF
char d_troff = "TROFF" char d_troff = "TROFF"
byte = 0 byte = 0
word = @d_tron, @_troff_, 0 word = @d_tron, @_troff_
// BREAK OUT // BREAK OUT
char d_brkout = "BRKOUT" char d_brkout = "BRKOUT"
byte = 0 byte = 0
word = @d_troff, @_brkout_, 0 word = @d_troff, @_brkout_
// BREAK ON // BREAK ON
char d_brkon = "BRKON" char d_brkon = "BRKON"
byte = 0 byte = 0
word = @d_brkout, @_brkon_, 0 word = @d_brkout, @_brkon_
// BREAK OFF // BREAK OFF
char d_brkoff = "BRKOFF" char d_brkoff = "BRKOFF"
byte = 0 byte = 0
word = @d_brkon, @_brkoff_, 0 word = @d_brkon, @_brkoff_
// COMPILE USING ITC // COMPILE USING ITC
char d_itc = "ITC" char d_itc = "ITC"
byte = 0 byte = 0
word = @d_brkoff, @_itc_, 0 word = @d_brkoff, @_itc_
// COMPILE USING PLASMA BYTECODES // COMPILE USING PLASMA BYTECODES
char d_pbc = "PBC" char d_pbc = "PBC"
byte = 0 byte = 0
word = @d_itc, @_pbc_, 0 word = @d_itc, @_pbc_
// LIST VOCAB // LIST VOCAB
char d_vlist = "VLIST" char d_vlist = "VLIST"
byte = 0 byte = 0
word = @d_pbc, @_vlist_, 0 word = @d_pbc, @_vlist_
// //
// Internal variables // Internal variables
// //
word vlist = @d_vlist word vlist = @d_vlist
word startheap, arg, infunc, inref, IIP, W, exit word startheap, arg, infunc, inptr, IIP, W, exit
const INBUF_SIZE = 80
char inbuf[INBUF_SIZE + 2]
const keyinbuf = $1FF const keyinbuf = $1FF
word inptr = @inbuf const SRCREFS = 2
const INBUF_SIZE = 81
byte srclevel = 0
byte inref[SRCREFS]
char inbuf[SRCREFS * INBUF_SIZE]
word inbufptr
// //
// RSTACK // RSTACK
// //
@ -551,16 +580,24 @@ def keyin#0
inptr++ inptr++
end end
def filein#0 def filein#0
inbuf = fileio:read(inref, @inbuf + 1, INBUF_SIZE) byte len
if inbuf repeat
inbuf[inbuf + 1] = 0 // NULL terminate len = fileio:read(inref[srclevel-1], inbufptr, INBUF_SIZE-1)
inptr = @inbuf + 1 if len
else ^(inbufptr + len) = 0 // NULL terminate
fileio:close(inref) // EOF - switch back to keyboard input inptr = inbufptr
inref = 0 else
infunc = @keyin srclevel--
keyin inbufptr = inbufptr - INBUF_SIZE
fin fileio:close(inref[srclevel]) // EOF
if srclevel == 0 // - switch back to keyboard input
inref = 0
infunc = @keyin
keyin
return
fin
fin
until len
end end
def toknext#2 def toknext#2
word tokptr word tokptr
@ -774,10 +811,11 @@ def warmstart#0
vlist = *_lfa_(vlist) vlist = *_lfa_(vlist)
fin fin
state = 0 state = 0
if inref while srclevel
fileio:close(inref) srclevel--
inref = 0 fileio:close(inref[srclevel])
fin inref[srclevel] = 0
loop
end end
// //
// Cold start // Cold start
@ -799,6 +837,13 @@ def interpret#0
dentry = find(inchars, inlen) dentry = find(inchars, inlen)
if dentry if dentry
if (not (state & comp_flag)) or (^_ffa_(dentry) & imm_flag) if (not (state & comp_flag)) or (^_ffa_(dentry) & imm_flag)
if ^_ffa_(dentry) & componly_flag
inchars--
^inchars = inlen
puts(inchars)
puts(" : Compile ony word\n")
_abort_
fin
execword(dentry) execword(dentry)
elsif state & comp_itc_flag elsif state & comp_itc_flag
pfillw(dentry) pfillw(dentry)
@ -820,8 +865,11 @@ def interpret#0
else else
value, valid = isnum(inchars, inlen) value, valid = isnum(inchars, inlen)
if not valid if not valid
inchars--
^inchars = inlen
puts(inchars)
puts(" ? No match\n")
warmstart warmstart
puts("? No match\n")
else else
if state & comp_flag if state & comp_flag
if state & comp_itc_flag if state & comp_itc_flag
@ -884,9 +932,18 @@ end
def _div_(a,b)#1 def _div_(a,b)#1
return a/b return a/b
end end
def _mod_(a,b)#1
return a%b
end
def _neg_(a)#1 def _neg_(a)#1
return -a return -a
end end
def _lshift_(a,b)#1
return a<<b
end
def _rshift_(a,b)#1
return a>>b
end
def _and_(a,b)#1 def _and_(a,b)#1
return a & b return a & b
end end
@ -1002,7 +1059,7 @@ def _create_#0
word bldptr, plist, namechars, namelen word bldptr, plist, namechars, namelen
if state & comp_flag if state & comp_flag
puts(" Already compiling\n") puts(" CREATE already compiling\n")
_abort_ _abort_
fin fin
namechars, namelen = toknext namechars, namelen = toknext
@ -1147,7 +1204,7 @@ def _semi_#0
elsif state & comp_pbc_flag elsif state & comp_pbc_flag
pfillb($5C) // RET pfillb($5C) // RET
else else
puts(" Not compiling\n") puts("; Not compiling\n")
_abort_ _abort_
fin fin
state = state & ~comp_flag state = state & ~comp_flag
@ -1403,6 +1460,15 @@ end
def _prat_(a)#0 def _prat_(a)#0
puti(*a) puti(*a)
end end
def _space_#0
putc(' ')
end
def _spaces_(a)#0
while a
putc(' ')
a--
loop
end
def _str_#0 def _str_#0
word str word str
byte len byte len
@ -1442,17 +1508,22 @@ end
def _src_#0 def _src_#0
word filename word filename
byte len byte len
byte params[4]
filename, len = delimit('"') filename, len = delimit('"')
filename-- filename--
^filename = len ^filename = len
inref = fileio:open(filename) if srclevel >= SRCREFS
if inref puts("Too many nested SRC\"")
fileio:newline(inref, $7F, $0D) _abort_
infunc = @filein fin
inptr = @inbuf inref[srclevel] = fileio:open(filename)
inbuf = 0 if inref[srclevel]
fileio:newline(inref[srclevel], $7F, $0D)
infunc = @filein
inbufptr = @inbuf + srclevel * INBUF_SIZE
inptr = inbufptr
^inptr = 0
srclevel++
else else
puts("Failed to open "); puts(filename); putln puts("Failed to open "); puts(filename); putln
fin fin
@ -1600,7 +1671,7 @@ if cmdsys:sysver < $0201
return return
fin fin
warmstart warmstart
fileio:iobufalloc(2) // Allocate buffer away from system buffer fileio:iobufalloc(4) // Allocate a bunch of file buffers
_estkl = ^(@syscall + 1) // Hack to fill in parameter stack locations _estkl = ^(@syscall + 1) // Hack to fill in parameter stack locations
_estkh = ^(@syscall + 3) _estkh = ^(@syscall + 3)
inptr = argNext(argFirst) inptr = argNext(argFirst)

View File

@ -34,7 +34,7 @@ predef markheap()#1, allocheap(size)#1, allocalignheap(size, pow2, freeaddr)#1,
predef memset(addr,value,size)#0, memcpy(dst,src,size)#0, strcpy(dst,src)#1, strcat(dst,src)#1 predef memset(addr,value,size)#0, memcpy(dst,src,size)#0, strcpy(dst,src)#1, strcat(dst,src)#1
predef uword_isgt(a,b)#1, uword_isge(a,b)#1, uword_islt(a,b)#1, uword_isle(a,b)#1, sext(a)#1, divmod(a,b)#2 predef uword_isgt(a,b)#1, uword_isge(a,b)#1, uword_islt(a,b)#1, uword_isle(a,b)#1, sext(a)#1, divmod(a,b)#2
predef execmod(modfile)#1, open(path)#1, close(refnum)#1, read(refnum, buff, len)#1, write(refnum, buff, len)#1 predef execmod(modfile)#1, open(path)#1, close(refnum)#1, read(refnum, buff, len)#1, write(refnum, buff, len)#1
predef lookuptbl(str)#1 predef lookuptbl(dci)#1
// //
// Exported CMDSYS table // Exported CMDSYS table
// //