summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jefs.fs14
-rw-r--r--jefs.s55
2 files changed, 64 insertions, 5 deletions
diff --git a/jefs.fs b/jefs.fs
index b4e2624..8e56fd2 100644
--- a/jefs.fs
+++ b/jefs.fs
@@ -1,3 +1,9 @@
+: cell+ 8 + ;
+: syswrite ( u c-addr fd -- n ) 1 syscall3 ;
+: say ( c-addr u -- ) swap 1 syswrite drop ;
+: emit ( chr -- ) sp cell+ 1 swap 1 syswrite 2drop ;
+: cr 10 emit ;
+
: decimal 10 base ! ;
: hex 16 base ! ;
@@ -6,18 +12,16 @@
: [compile] parse find drop >cfa compile, ; immediate
: ' parse find drop >cfa [compile] lit ; immediate \ note: no error handling (yet)
+: constant create [compile] lit 195 ( ret ) c, ;
+65 constant TESTING
: begin here @ ; immediate
: again branch here @ 4 + - d, ; immediate \ add 4 to get to beginning of the next instruction
+: until 0branch here @ 4 + - d, ;
: if 0branch here @ 0 d, ; immediate ( I: -- a )
: then dup here @ swap - 4 - swap d! ; immediate
-: cell+ 8 + ;
: / /mod swap drop ;
: mod /mod drop ;
-: syswrite ( u c-addr fd -- n ) 1 syscall3 ;
-: say ( c-addr u -- ) swap 1 syswrite drop ;
-: emit ( chr -- ) sp cell+ 1 swap 1 syswrite 2drop ;
-: cr 10 emit ;
TESTSTR say cr bye
diff --git a/jefs.s b/jefs.s
index 555d430..5101a8f 100644
--- a/jefs.s
+++ b/jefs.s
@@ -165,6 +165,28 @@ defword "c,", c_comma, 0
mov qword [here], r12
ret
+defword "cmove", _cmove, 0 ; ( a1 a2 u -- )
+ pspop rcx
+ pspop rdi
+ pspop rsi
+
+ rep movsb
+ ret
+
+defword "cmove,", _cmove_comma, 0 ; ( c-addr u -- )
+ mov r12, qword [here]
+
+ pspop r9
+ mov rcx, r9
+ pspop rsi
+ mov rdi, r12
+
+ rep movsb
+
+ add r12, r9
+ mov qword [here], r12
+ ret
+
; note: this puts the _address it itself pushes_ on the stack
; maybe this is not the correct approach?
defword "sp", _sp, 0
@@ -376,6 +398,7 @@ defword "compile,", compile_comma, 0
mov qword [here], r12
ret
+; todo: separate the CREATE functionality out
defword ":", colon, 0
call parse
pspop r9 ; u
@@ -421,6 +444,38 @@ defword ";", semicolon, immediate_mask
mov qword [state], interpreting
ret
+; this is basically an edited copy of :
+; which should probably be rewritten to use this word
+; the differences:
+; this word does not change state
+; smudge mask is not set
+defword "create", create, 0
+ call parse
+ pspop r9 ; u
+ pspop r10 ; c-addr
+ mov r11, [latest]
+ mov r12, [here]
+ push r12 ; keep for LATEST
+
+ mov qword [r12], r11
+ add r12, 8
+ mov byte [r12], 0
+ inc r12
+ mov word [r12], r9w ; r9w from r9: safe?
+ add r12, 2
+
+ ; strcpy
+ mov rcx, r9
+ mov rsi, r10
+ mov rdi, r12
+ rep movsb
+ add r12, r9
+
+ mov qword [here], r12
+ pop r12
+ mov qword [latest], r12
+ ret
+
defword "number", number, 0 ; ( c-addr u -- ?n flag )
pspop r11 ; u
pspop r12 ; c-addr