diff options
| -rw-r--r-- | jefs.fs | 14 | ||||
| -rw-r--r-- | jefs.s | 55 |
2 files changed, 64 insertions, 5 deletions
@@ -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 @@ -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 |
