summaryrefslogtreecommitdiff
path: root/jefs.fs
diff options
context:
space:
mode:
Diffstat (limited to 'jefs.fs')
-rw-r--r--jefs.fs82
1 files changed, 42 insertions, 40 deletions
diff --git a/jefs.fs b/jefs.fs
index 8bd6e79..63e1d46 100644
--- a/jefs.fs
+++ b/jefs.fs
@@ -17,27 +17,6 @@
: decimal 10 base ! ;
: hex 16 base ! ;
-: nip swap drop ;
-: tuck swap over ;
-
-hex : ret, c3 c, ; decimal
-
-: cells 8 * ;
-: allot> here @ swap here +! ;
-: allot allot> drop ;
-
-: [compile] parse find drop >cfa compile, ; immediate
-: ' parse find drop >cfa [compile] lit ; immediate \ note: no error handling (yet)
-: recurse latest @ >cfa compile, ; immediate
-: s, ( c-addr u -- ) here @ swap ( c-addr here u ) dup >r cmove r> here +! ;
-
-: literal [compile] lit ; immediate
-: constant create [compile] lit ret, ;
-: variable 1 cells allot> create [compile] lit ret, ;
-\ maybe i made bad design decisions, this is CREATE but it pushes a pointer to just after its definition. for arrays and the like
-\ does not use LIT because we want to fill it in After
-: make create here @ 18 + [compile] lit ret, ;
-
\ FLOW CONTROL {{{
\ jump helpers from forth83 (got them from pforth tho ehehe)
\ < backward jump > forward jump
@@ -57,13 +36,51 @@ hex : ret, c3 c, ; decimal
: repeat branch swap <resolve >resolve ; immediate
: ?dup dup 0<> if dup then ;
+\ }}}
+
+: nip swap drop ;
+: tuck swap over ;
+
+hex : ret, c3 c, ; decimal
+
+: execute [ hex
+ 4d c, 8b c, 1e c, \ mov r11, [r14]
+ \ REX.W + 8B /r -- MOV r64, r/m64
+ \ rex w (64 bit operand size), r (modrm.reg ext), b (modrm.rm ext)
+ \ modrm 00 011 110
+ \ mod [r/m] reg 1.011 (r11) r/m 1.110 (r14)
+ 4d c, 8d c, 76 c, 08 c, \ lea r14, [r14+8]
+ \ REX.W + 8D /r -- LEA r64, m
+ \ rex w (64 bit operand size), r (modrm.reg ext), b (modrm.rm ext)
+ \ modrm 01 110 110
+ \ mod [r/m+disp8] reg 1.110 (r14) r/m 1.110 (r14)
+ 41 c, ff c, d3 c, \ call r11
+ \ FF /2 -- CALL r/m64
+ \ rex b (.rm ext)
+ \ modrm 11 010 011
+ \ mod r/m reg /2 r/m 1.011 (r11)
+ decimal ] ;
+
+: cells 8 * ;
+: allot> here @ swap here +! ;
+: allot allot> drop ;
+
+: [compile] parse find drop >cfa compile, ; immediate
+: ' parse find drop >cfa state @ if [compile] lit then ; immediate \ note: no error handling (yet)
+: recurse latest @ >cfa compile, ; immediate
+
+: literal [compile] lit ; immediate
+: constant create [compile] lit ret, ;
+: variable 1 cells allot> create [compile] lit ret, ;
+\ maybe i made bad design decisions, this is CREATE but it pushes a pointer to just after its definition. for arrays and the like
+\ does not use LIT because we want to fill it in After
+: make create here @ 18 + [compile] lit ret, ;
\ jonesforth impl
: case 0 ; immediate
: of ' over compile, ' = compile, [compile] if ' drop compile, ; immediate
: endof [compile] else ; immediate
: endcase ' drop compile, begin ?dup while [compile] then repeat ; immediate
-\ }}}
: value create [compile] lit ret, ;
: to parse find drop >cfa 6 + state @ if
@@ -133,24 +150,6 @@ variable modrm
decimal
\ }}}
-: execute [ hex
- 4d c, 8b c, 1e c, \ mov r11, [r14]
- \ REX.W + 8B /r -- MOV r64, r/m64
- \ rex w (64 bit operand size), r (modrm.reg ext), b (modrm.rm ext)
- \ modrm 00 011 110
- \ mod [r/m] reg 1.011 (r11) r/m 1.110 (r14)
- 4d c, 8d c, 76 c, 08 c, \ lea r14, [r14+8]
- \ REX.W + 8D /r -- LEA r64, m
- \ rex w (64 bit operand size), r (modrm.reg ext), b (modrm.rm ext)
- \ modrm 01 110 110
- \ mod [r/m+disp8] reg 1.110 (r14) r/m 1.110 (r14)
- 41 c, ff c, d3 c, \ call r11
- \ FF /2 -- CALL r/m64
- \ rex b (.rm ext)
- \ modrm 11 010 011
- \ mod r/m reg /2 r/m 1.011 (r11)
- decimal ] ;
-
: / /mod swap drop ;
: mod /mod drop ;
: negate 0 swap - ;
@@ -258,6 +257,9 @@ make file-buffer file-buffer-length allot
: write-file ( c-addr u fd -- ?u flag ) >r swap r> syswrite errno ;
\ }}}
+\ INTERACTIVITY {{{
+\ }}}
+
file-buffer file-buffer-length stdin read-file drop file-buffer swap evaluate
bye
\ .free bye