summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkitty <nepeta@canaglie.net>2026-03-07 17:18:39 +1100
committerkitty <nepeta@canaglie.net>2026-03-07 17:18:39 +1100
commit1fe30216ca6fbee0595a5419a979c8b06ea56a28 (patch)
treed1405bf411f7f6ece696bbad2bb671b71a9e46d3
parentb226f8ae99a630334356b0e0e1de44429b64155d (diff)
replace raw byte execute with assembled execute
yay!!!!
-rw-r--r--jefs.fs52
-rw-r--r--readme.md1
2 files changed, 10 insertions, 43 deletions
diff --git a/jefs.fs b/jefs.fs
index ef03baf..fba5461 100644
--- a/jefs.fs
+++ b/jefs.fs
@@ -1,15 +1,4 @@
\ i think something is going on with the stack. i dunno
-\ things TODO:
-\ standardise stack comment abbrs (i like leo brodie's forth_style.txt)
-\ DO LOOP
-\ s\"
-\ add error handling to compiling words
-\ better syscall error handling
-\ <builds does>
-\ argc/argv
-\ load file
-\ DUMP
-\ custom Nicer line mode editing (like rlwrap)
: cell+ 8 + ;
: say ( c-addr u -- ) swap 1 1 syscall3 drop ;
@@ -46,27 +35,6 @@
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 ] ;
-
-: ?comp state @ 0<> if 3 error ! handler execute then ;
-: ?intr state @ if 4 error ! handler execute then ;
-
: cells 8 * ;
: allot@ here @ swap here +! ;
: allot allot@ drop ;
@@ -162,20 +130,24 @@ variable disp
: modrm, modrm @ c, disp @ ?dup 0<> if c, then ;
: mod0 modrm @ 3f and modrm ! ;
-: d) dup disp ! ( mod0 ) 0<> if modrm @ 40 or modrm ! then ; \ disp8 or 0 only for now. bug TODO: doesn't put correct .mod bytes
+: d) dup disp ! mod0 0<> if modrm @ 40 or modrm ! then ; \ disp8 or 0 only for now. bug TODO: doesn't put correct .mod bytes
: disp, disp @ ?dup 0<> if c, then ;
: mov, rex, 8b c, modrm @ c, disp, asm$ ;
: lea, rex, 8d c, modrm @ c, disp, asm$ ;
: call, rex, ff c, /2 modrm @ c, disp, asm$ ;
-
-\ example idea: (from execute below)
-\ rex.w r11, r14 0 d) mov,
-\ rex.w r14, r14 8 d) lea,
-\ r11 call,
decimal
\ }}}
+\ could be inlined?
+: execute [ rex.w r11, r14 0 d) mov,
+ rex.w r14, r14 8 d) lea,
+ r11 call, ] ;
+
+: ?comp state @ 0<> if 3 error ! handler execute then ;
+: ?intr state @ if 4 error ! handler execute then ;
+
+
hex
: >word ffff and ;
: >byte ff and ;
@@ -440,8 +412,4 @@ decimal
0 constant version
: welcome ." welcome to Jewelforth, version " version u. cr .free ;
-\ : execute2 [ rex.w r11, r14 0 d) mov,
-\ rex.w r14, r14 8 d) lea,
-\ r11 call, ] ;
-
welcome quit bye
diff --git a/readme.md b/readme.md
index ecfa81e..0b1b518 100644
--- a/readme.md
+++ b/readme.md
@@ -13,7 +13,6 @@ i am thinking of completing before that.
- `s\"`
- `DO` + `LOOP`
-- `{+,-}TO`
- `\<BUILDS` and `DOES>`
- reading from files
- argc + argv