summaryrefslogtreecommitdiff
path: root/jefs.s
diff options
context:
space:
mode:
Diffstat (limited to 'jefs.s')
-rw-r--r--jefs.s41
1 files changed, 41 insertions, 0 deletions
diff --git a/jefs.s b/jefs.s
index 3234b44..806e3b2 100644
--- a/jefs.s
+++ b/jefs.s
@@ -46,6 +46,9 @@
%assign smudge_mask 0x1
%assign immemdiate_mask 0x2
+
+%assign false 0x0
+%assign true 0xffffffffffffffff
;;; }}}
;; syscall
@@ -141,7 +144,44 @@ defword "parse", parse, 0
pspush r11 ; u
ret
+; probably fucked up and broken. have not tested any of this yet
defword "find", find, 0
+ pspop r10 ; u
+ pspop r11 ; c-addr
+ mov r12, latest
+ mov r13, qword [r12]
+ mov r12, r13
+
+.check_smudge:
+ add r13, 8
+ mov r9b, byte [r13]
+ test r9b, smudge_mask
+ jnz .no
+
+.no_smudge:
+ inc r13
+ mov r9w, word [r13]
+ cmp r9w, r10w
+ jne .no
+ mov rsi, r13
+ add rsi, 2
+ mov rdi, r11
+ repz cmpsb
+ jnz .no
+ sub r13, 9
+ pspush r13
+ mov r13, true
+ pspush r13
+ ret
+
+.no:
+ mov r13, qword [r12]
+ mov r12, r13
+ cmp r13, 0 ; end of dictionary? fallthrough to notfound if so
+ jne .check_smudge
+
+ mov r13, false
+ pspush r13
ret
; stage 1 interpreter, just reads from initfile
@@ -149,6 +189,7 @@ defword "interpret", interpret, 0
ret
defvar ">in", to_in, 0, initfile
+defvar "latest", latest, 0, lfa_latest
initfile:
incbin "jefs.fs"