Closer still on asm.js
Split apart boot.fs some more.
This commit is contained in:
104
common/boot.fs
104
common/boot.fs
@ -12,11 +12,6 @@
|
||||
\ See the License for the specific language governing permissions and
|
||||
\ limitations under the License.
|
||||
|
||||
: ( 41 parse drop drop ; immediate
|
||||
: \ 10 parse drop drop ; immediate
|
||||
: #! 10 parse drop drop ; immediate ( shebang for scripts )
|
||||
( Now can do comments! )
|
||||
|
||||
( Stack Baseline )
|
||||
sp@ constant sp0
|
||||
rp@ constant rp0
|
||||
@ -108,102 +103,3 @@ variable handler
|
||||
( Deferred Words )
|
||||
: defer ( "name" -- ) create 0 , does> @ dup 0= throw execute ;
|
||||
: is ( xt "name -- ) postpone to ; immediate
|
||||
|
||||
( Defer I/O to platform specific )
|
||||
defer type
|
||||
defer key
|
||||
defer key?
|
||||
defer bye
|
||||
: emit ( n -- ) >r rp@ 1 type rdrop ;
|
||||
: space bl emit ; : cr 13 emit nl emit ;
|
||||
|
||||
( Numeric Output )
|
||||
variable hld
|
||||
: pad ( -- a ) here 80 + ;
|
||||
: digit ( u -- c ) 9 over < 7 and + 48 + ;
|
||||
: extract ( n base -- n c ) u/mod swap digit ;
|
||||
: <# ( -- ) pad hld ! ;
|
||||
: hold ( c -- ) hld @ 1 - dup hld ! c! ;
|
||||
: # ( u -- u ) base @ extract hold ;
|
||||
: #s ( u -- 0 ) begin # dup while repeat ;
|
||||
: sign ( n -- ) 0< if 45 hold then ;
|
||||
: #> ( w -- b u ) drop hld @ pad over - ;
|
||||
: str ( n -- b u ) dup >r abs <# #s r> sign #> ;
|
||||
: hex ( -- ) 16 base ! ; : octal ( -- ) 8 base ! ;
|
||||
: decimal ( -- ) 10 base ! ; : binary ( -- ) 2 base ! ;
|
||||
: u. ( u -- ) <# #s #> type space ;
|
||||
: . ( w -- ) base @ 10 xor if u. exit then str type space ;
|
||||
: ? ( a -- ) @ . ;
|
||||
: n. ( n -- ) base @ swap decimal <# #s #> type base ! ;
|
||||
|
||||
( Strings )
|
||||
: parse-quote ( -- a n ) [char] " parse ;
|
||||
: $place ( a n -- ) for aft dup c@ c, 1+ then next drop ;
|
||||
: zplace ( a n -- ) $place 0 c, align ;
|
||||
: $@ r@ dup cell+ swap @ r> dup @ 1+ aligned + cell+ >r ;
|
||||
: s" parse-quote state @ if postpone $@ dup , zplace
|
||||
else dup here swap >r >r zplace r> r> then ; immediate
|
||||
: ." postpone s" state @ if postpone type else type then ; immediate
|
||||
: z" postpone s" state @ if postpone drop else drop then ; immediate
|
||||
: r" parse-quote state @ if swap aliteral aliteral then ; immediate
|
||||
: r| [char] | parse state @ if swap aliteral aliteral then ; immediate
|
||||
: r~ [char] ~ parse state @ if swap aliteral aliteral then ; immediate
|
||||
: s>z ( a n -- z ) here >r zplace r> ;
|
||||
: z>s ( z -- a n ) 0 over begin dup c@ while 1+ swap 1+ swap repeat drop ;
|
||||
|
||||
( Better Errors )
|
||||
: notfound ( a n n -- )
|
||||
if cr ." ERROR: " type ." NOT FOUND!" cr -1 throw then ;
|
||||
' notfound 'notfound !
|
||||
|
||||
( Input )
|
||||
: raw.s depth 0 max for aft sp@ r@ cells - @ . then next ;
|
||||
variable echo -1 echo ! variable arrow -1 arrow ! 0 value wascr
|
||||
: *emit ( n -- ) dup 13 = if drop cr else emit then ;
|
||||
: ?echo ( n -- ) echo @ if *emit else drop then ;
|
||||
: ?arrow. arrow @ if >r >r raw.s r> r> ." --> " then ;
|
||||
: *key ( -- n )
|
||||
begin
|
||||
key
|
||||
dup nl = if
|
||||
drop wascr if 0 else 13 exit then
|
||||
then
|
||||
dup 13 = to wascr
|
||||
dup if exit else drop then
|
||||
again ;
|
||||
: eat-till-cr begin *key dup 13 = if ?echo exit else drop then again ;
|
||||
: accept ( a n -- n ) ?arrow. 0 swap begin 2dup < while
|
||||
*key
|
||||
dup 13 = if ?echo drop nip exit then
|
||||
dup 8 = over 127 = or if
|
||||
drop over if rot 1- rot 1- rot 8 ?echo bl ?echo 8 ?echo then
|
||||
else
|
||||
dup ?echo
|
||||
>r rot r> over c! 1+ -rot swap 1+ swap
|
||||
then
|
||||
repeat drop nip
|
||||
eat-till-cr
|
||||
;
|
||||
200 constant input-limit
|
||||
: tib ( -- a ) 'tib @ ;
|
||||
create input-buffer input-limit allot
|
||||
: tib-setup input-buffer 'tib ! ;
|
||||
: refill tib-setup tib input-limit accept #tib ! 0 >in ! -1 ;
|
||||
|
||||
( REPL )
|
||||
: prompt ." ok" cr ;
|
||||
: evaluate-buffer begin >in @ #tib @ < while evaluate1 repeat ;
|
||||
: evaluate ( a n -- ) 'tib @ >r #tib @ >r >in @ >r
|
||||
#tib ! 'tib ! 0 >in ! evaluate-buffer
|
||||
r> >in ! r> #tib ! r> 'tib ! ;
|
||||
: quit begin ['] evaluate-buffer catch
|
||||
if 0 state ! sp0 sp! fp0 fp! rp0 rp! ." ERROR" cr then
|
||||
prompt refill drop again ;
|
||||
variable boot-prompt
|
||||
: free. ( nf nu -- ) 2dup swap . ." free + " . ." used = " 2dup + . ." total ("
|
||||
over + 100 -rot */ n. ." % free)" ;
|
||||
: raw-ok ." v{{VERSION}} - rev {{REVISION}}" cr
|
||||
boot-prompt @ if boot-prompt @ execute then
|
||||
." Forth dictionary: " remaining used free. cr
|
||||
." 3 x Forth stacks: " 'stack-cells @ cells . ." bytes each" cr
|
||||
prompt refill drop quit ;
|
||||
|
||||
18
common/comments.fs
Normal file
18
common/comments.fs
Normal file
@ -0,0 +1,18 @@
|
||||
\ Copyright 2022 Bradley D. Nelson
|
||||
\
|
||||
\ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
\ you may not use this file except in compliance with the License.
|
||||
\ You may obtain a copy of the License at
|
||||
\
|
||||
\ http://www.apache.org/licenses/LICENSE-2.0
|
||||
\
|
||||
\ Unless required by applicable law or agreed to in writing, software
|
||||
\ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
\ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
\ See the License for the specific language governing permissions and
|
||||
\ limitations under the License.
|
||||
|
||||
: ( 41 parse drop drop ; immediate
|
||||
: \ 10 parse drop drop ; immediate
|
||||
: #! 10 parse drop drop ; immediate ( shebang for scripts )
|
||||
( Now can do comments! )
|
||||
@ -122,8 +122,9 @@ static cell_t find(const char *name, cell_t len) {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!(*TOFLAGS(xt) & SMUDGE) && len == *TONAMELEN(xt) &&
|
||||
same(name, TONAME(xt), len)) {
|
||||
if (!(*TOFLAGS(xt) & SMUDGE) &&
|
||||
len == *TONAMELEN(xt) &&
|
||||
same(name, TONAME(xt), len)) {
|
||||
return xt;
|
||||
}
|
||||
xt = *TOLINK(xt);
|
||||
@ -161,11 +162,12 @@ static cell_t parse(cell_t sep, cell_t *ret) {
|
||||
while (g_sys->tin < g_sys->ntib &&
|
||||
match(sep, g_sys->tib[g_sys->tin])) { ++g_sys->tin; }
|
||||
}
|
||||
*ret = (cell_t) (g_sys->tib + g_sys->tin);
|
||||
cell_t start = g_sys->tin;
|
||||
while (g_sys->tin < g_sys->ntib &&
|
||||
!match(sep, g_sys->tib[g_sys->tin])) { ++g_sys->tin; }
|
||||
cell_t len = g_sys->tin - (*ret - (cell_t) g_sys->tib);
|
||||
cell_t len = g_sys->tin - start;
|
||||
if (g_sys->tin < g_sys->ntib) { ++g_sys->tin; }
|
||||
*ret = (cell_t) (g_sys->tib + start);
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
@ -12,6 +12,8 @@
|
||||
\ See the License for the specific language governing permissions and
|
||||
\ limitations under the License.
|
||||
|
||||
( Words in this file are typically implemented as opcodes in extra_opcodes.h )
|
||||
|
||||
( Useful Basic Compound Words )
|
||||
: nip ( a b -- b ) swap drop ;
|
||||
: rdrop ( r: n n -- ) r> r> drop >r ;
|
||||
@ -49,17 +51,6 @@
|
||||
: 2@ ( a -- lo hi ) dup @ swap cell+ @ ;
|
||||
: 2! ( lo hi a -- ) dup >r cell+ ! r> ! ;
|
||||
|
||||
( Fill, Move )
|
||||
: cmove ( a a n -- ) for aft >r dup c@ r@ c! 1+ r> 1+ then next 2drop ;
|
||||
: cmove> ( a a n -- ) for aft 2dup swap r@ + c@ swap r@ + c! then next 2drop ;
|
||||
: fill ( a n ch -- ) swap for swap aft 2dup c! 1 + then next 2drop ;
|
||||
: erase ( a n -- ) 0 fill ; : blank ( a n -- ) bl fill ;
|
||||
|
||||
( Compound words requiring conditionals )
|
||||
: min 2dup < if drop else nip then ;
|
||||
: max 2dup < if nip else drop then ;
|
||||
: abs ( n -- +n ) dup 0< if negate then ;
|
||||
|
||||
( Dictionary )
|
||||
: here ( -- a ) 'sys @ ;
|
||||
: allot ( n -- ) 'sys +! ;
|
||||
@ -68,15 +59,6 @@
|
||||
: , ( n -- ) here ! cell allot ;
|
||||
: c, ( ch -- ) here c! 1 allot ;
|
||||
|
||||
( Dictionary Format )
|
||||
: >flags& ( xt -- a ) cell - ; : >flags ( xt -- flags ) >flags& c@ ;
|
||||
: >name-length ( xt -- n ) >flags& 1+ c@ ;
|
||||
: >params ( xt -- n ) >flags& 2 + sw@ $ffff and ;
|
||||
: >size ( xt -- n ) dup >params cells swap >name-length aligned + 3 cells + ;
|
||||
: >link& ( xt -- a ) 2 cells - ; : >link ( xt -- a ) >link& @ ;
|
||||
: >name ( xt -- a n ) dup >name-length swap >link& over aligned - swap ;
|
||||
: >body ( xt -- a ) dup @ [ ' >flags @ ] literal = 2 + cells + ;
|
||||
|
||||
( System Variables )
|
||||
: sys: ( a -- a' "name" ) dup constant cell+ ;
|
||||
'sys sys: 'heap sys: current sys: 'context
|
||||
@ -89,6 +71,21 @@
|
||||
: context ( -- a ) 'context @ cell+ ;
|
||||
: latestxt ( -- xt ) 'latestxt @ ;
|
||||
|
||||
( Compilation State )
|
||||
: [ 0 state ! ; immediate
|
||||
: ] -1 state ! ; immediate
|
||||
: ' bl parse 2dup find dup >r -rot r> 0= 'notfound @ execute 2drop ;
|
||||
: literal aliteral ; immediate
|
||||
|
||||
( Dictionary Format )
|
||||
: >flags& ( xt -- a ) cell - ; : >flags ( xt -- flags ) >flags& c@ ;
|
||||
: >name-length ( xt -- n ) >flags& 1+ c@ ;
|
||||
: >params ( xt -- n ) >flags& 2 + sw@ $ffff and ;
|
||||
: >size ( xt -- n ) dup >params cells swap >name-length aligned + 3 cells + ;
|
||||
: >link& ( xt -- a ) 2 cells - ; : >link ( xt -- a ) >link& @ ;
|
||||
: >name ( xt -- a n ) dup >name-length swap >link& over aligned - swap ;
|
||||
: >body ( xt -- a ) dup @ [ ' >flags @ ] literal = 2 + cells + ;
|
||||
|
||||
: f= ( r r -- f ) f- f0= ;
|
||||
: f< ( r r -- f ) f- f0< ;
|
||||
: f> ( r r -- f ) fswap f< ;
|
||||
@ -99,8 +96,3 @@
|
||||
4 constant sfloat
|
||||
: sfloats ( n -- n*4 ) sfloat * ;
|
||||
: sfloat+ ( a -- a ) sfloat + ;
|
||||
|
||||
3.14159265359e fconstant pi
|
||||
|
||||
: fsqrt ( r -- r ) 1e 20 0 do fover fover f/ f+ 0.5e f* loop fnip ;
|
||||
|
||||
24
common/extra2.fs
Normal file
24
common/extra2.fs
Normal file
@ -0,0 +1,24 @@
|
||||
\ Copyright 2022 Bradley D. Nelson
|
||||
\
|
||||
\ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
\ you may not use this file except in compliance with the License.
|
||||
\ You may obtain a copy of the License at
|
||||
\
|
||||
\ http://www.apache.org/licenses/LICENSE-2.0
|
||||
\
|
||||
\ Unless required by applicable law or agreed to in writing, software
|
||||
\ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
\ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
\ See the License for the specific language governing permissions and
|
||||
\ limitations under the License.
|
||||
|
||||
( Fill, Move )
|
||||
: cmove ( a a n -- ) for aft >r dup c@ r@ c! 1+ r> 1+ then next 2drop ;
|
||||
: cmove> ( a a n -- ) for aft 2dup swap r@ + c@ swap r@ + c! then next 2drop ;
|
||||
: fill ( a n ch -- ) swap for swap aft 2dup c! 1 + then next 2drop ;
|
||||
: erase ( a n -- ) 0 fill ; : blank ( a n -- ) bl fill ;
|
||||
|
||||
( Compound words requiring conditionals )
|
||||
: min 2dup < if drop else nip then ;
|
||||
: max 2dup < if nip else drop then ;
|
||||
: abs ( n -- +n ) dup 0< if negate then ;
|
||||
17
common/extra3.fs
Normal file
17
common/extra3.fs
Normal file
@ -0,0 +1,17 @@
|
||||
\ Copyright 2022 Bradley D. Nelson
|
||||
\
|
||||
\ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
\ you may not use this file except in compliance with the License.
|
||||
\ You may obtain a copy of the License at
|
||||
\
|
||||
\ http://www.apache.org/licenses/LICENSE-2.0
|
||||
\
|
||||
\ Unless required by applicable law or agreed to in writing, software
|
||||
\ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
\ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
\ See the License for the specific language governing permissions and
|
||||
\ limitations under the License.
|
||||
|
||||
: fsqrt ( r -- r ) 1e 20 0 do fover fover f/ f+ 0.5e f* loop fnip ;
|
||||
|
||||
3.14159265359e fconstant pi
|
||||
112
common/io.fs
Normal file
112
common/io.fs
Normal file
@ -0,0 +1,112 @@
|
||||
\ Copyright 2022 Bradley D. Nelson
|
||||
\
|
||||
\ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
\ you may not use this file except in compliance with the License.
|
||||
\ You may obtain a copy of the License at
|
||||
\
|
||||
\ http://www.apache.org/licenses/LICENSE-2.0
|
||||
\
|
||||
\ Unless required by applicable law or agreed to in writing, software
|
||||
\ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
\ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
\ See the License for the specific language governing permissions and
|
||||
\ limitations under the License.
|
||||
|
||||
( Defer I/O to platform specific )
|
||||
defer type
|
||||
defer key
|
||||
defer key?
|
||||
defer bye
|
||||
: emit ( n -- ) >r rp@ 1 type rdrop ;
|
||||
: space bl emit ; : cr 13 emit nl emit ;
|
||||
|
||||
( Numeric Output )
|
||||
variable hld
|
||||
: pad ( -- a ) here 80 + ;
|
||||
: digit ( u -- c ) 9 over < 7 and + 48 + ;
|
||||
: extract ( n base -- n c ) u/mod swap digit ;
|
||||
: <# ( -- ) pad hld ! ;
|
||||
: hold ( c -- ) hld @ 1 - dup hld ! c! ;
|
||||
: # ( u -- u ) base @ extract hold ;
|
||||
: #s ( u -- 0 ) begin # dup while repeat ;
|
||||
: sign ( n -- ) 0< if 45 hold then ;
|
||||
: #> ( w -- b u ) drop hld @ pad over - ;
|
||||
: str ( n -- b u ) dup >r abs <# #s r> sign #> ;
|
||||
: hex ( -- ) 16 base ! ; : octal ( -- ) 8 base ! ;
|
||||
: decimal ( -- ) 10 base ! ; : binary ( -- ) 2 base ! ;
|
||||
: u. ( u -- ) <# #s #> type space ;
|
||||
: . ( w -- ) base @ 10 xor if u. exit then str type space ;
|
||||
: ? ( a -- ) @ . ;
|
||||
: n. ( n -- ) base @ swap decimal <# #s #> type base ! ;
|
||||
|
||||
( Strings )
|
||||
: parse-quote ( -- a n ) [char] " parse ;
|
||||
: $place ( a n -- ) for aft dup c@ c, 1+ then next drop ;
|
||||
: zplace ( a n -- ) $place 0 c, align ;
|
||||
: $@ r@ dup cell+ swap @ r> dup @ 1+ aligned + cell+ >r ;
|
||||
: s" parse-quote state @ if postpone $@ dup , zplace
|
||||
else dup here swap >r >r zplace r> r> then ; immediate
|
||||
: ." postpone s" state @ if postpone type else type then ; immediate
|
||||
: z" postpone s" state @ if postpone drop else drop then ; immediate
|
||||
: r" parse-quote state @ if swap aliteral aliteral then ; immediate
|
||||
: r| [char] | parse state @ if swap aliteral aliteral then ; immediate
|
||||
: r~ [char] ~ parse state @ if swap aliteral aliteral then ; immediate
|
||||
: s>z ( a n -- z ) here >r zplace r> ;
|
||||
: z>s ( z -- a n ) 0 over begin dup c@ while 1+ swap 1+ swap repeat drop ;
|
||||
|
||||
( Better Errors )
|
||||
: notfound ( a n n -- )
|
||||
if cr ." ERROR: " type ." NOT FOUND!" cr -1 throw then ;
|
||||
' notfound 'notfound !
|
||||
|
||||
( Input )
|
||||
: raw.s depth 0 max for aft sp@ r@ cells - @ . then next ;
|
||||
variable echo -1 echo ! variable arrow -1 arrow ! 0 value wascr
|
||||
: *emit ( n -- ) dup 13 = if drop cr else emit then ;
|
||||
: ?echo ( n -- ) echo @ if *emit else drop then ;
|
||||
: ?arrow. arrow @ if >r >r raw.s r> r> ." --> " then ;
|
||||
: *key ( -- n )
|
||||
begin
|
||||
key
|
||||
dup nl = if
|
||||
drop wascr if 0 else 13 exit then
|
||||
then
|
||||
dup 13 = to wascr
|
||||
dup if exit else drop then
|
||||
again ;
|
||||
: eat-till-cr begin *key dup 13 = if ?echo exit else drop then again ;
|
||||
: accept ( a n -- n ) ?arrow. 0 swap begin 2dup < while
|
||||
*key
|
||||
dup 13 = if ?echo drop nip exit then
|
||||
dup 8 = over 127 = or if
|
||||
drop over if rot 1- rot 1- rot 8 ?echo bl ?echo 8 ?echo then
|
||||
else
|
||||
dup ?echo
|
||||
>r rot r> over c! 1+ -rot swap 1+ swap
|
||||
then
|
||||
repeat drop nip
|
||||
eat-till-cr
|
||||
;
|
||||
200 constant input-limit
|
||||
: tib ( -- a ) 'tib @ ;
|
||||
create input-buffer input-limit allot
|
||||
: tib-setup input-buffer 'tib ! ;
|
||||
: refill tib-setup tib input-limit accept #tib ! 0 >in ! -1 ;
|
||||
|
||||
( REPL )
|
||||
: prompt ." ok" cr ;
|
||||
: evaluate-buffer begin >in @ #tib @ < while evaluate1 repeat ;
|
||||
: evaluate ( a n -- ) 'tib @ >r #tib @ >r >in @ >r
|
||||
#tib ! 'tib ! 0 >in ! evaluate-buffer
|
||||
r> >in ! r> #tib ! r> 'tib ! ;
|
||||
: quit begin ['] evaluate-buffer catch
|
||||
if 0 state ! sp0 sp! fp0 fp! rp0 rp! ." ERROR" cr then
|
||||
prompt refill drop again ;
|
||||
variable boot-prompt
|
||||
: free. ( nf nu -- ) 2dup swap . ." free + " . ." used = " 2dup + . ." total ("
|
||||
over + 100 -rot */ n. ." % free)" ;
|
||||
: raw-ok ." v{{VERSION}} - rev {{REVISION}}" cr
|
||||
boot-prompt @ if boot-prompt @ execute then
|
||||
." Forth dictionary: " remaining used free. cr
|
||||
." 3 x Forth stacks: " 'stack-cells @ cells . ." bytes each" cr
|
||||
prompt refill drop quit ;
|
||||
@ -33,7 +33,7 @@ typedef uintptr_t ucell_t;
|
||||
#define PUSH DUP; tos = (cell_t)
|
||||
|
||||
#define PARK DUP; *++rp = (cell_t) fp; *++rp = (cell_t) sp; *++rp = (cell_t) ip
|
||||
#define UNPARK ip = (cell_t *) *rp--; sp = (cell_t *) *rp--; fp = (float *) *rp--; DROP
|
||||
#define UNPARK ip = (cell_t *) *rp--; sp = (cell_t *) *rp--; fp = (float *) *rp--; DROP
|
||||
|
||||
#define TOFLAGS(xt) ((uint8_t *) (((cell_t *) (xt)) - 1))
|
||||
#define TONAMELEN(xt) (TOFLAGS(xt) + 1)
|
||||
|
||||
Reference in New Issue
Block a user