mov qword [rbx+24],rcx ; PFA (length)
pop rsi ; chars* (source)
lea rdi,[rbx+32] ; (dest)
- ;; clear DF
+ cld
p_create_COPY:
movsb
dec rcx
WORD p_allot,'ALLOT'
;; ( n -- )
;; Allocate n bytes on the heap
- dq p_here, p_put_plus, p_exit
+ dq p_here, p_swap, p_put_plus, p_return
WORD p_quote,"'"
;; ( "word" -- cfa )
BRANCH 0,p_quote_end
dq p_tfa2cfa
p_quote_end:
- dq p_exit
+ dq p_return
WORD p_bracketed_quote,"[']",doforth,IMMEDIATE
;; Compilation ( "word" -- cfa )
;; Compile down " LIT value "
- dq p_literal, p_literal, p_comma,p_quote, p_comma, p_exit
+ dq p_literal, p_literal, p_comma,p_quote, p_comma, p_return
- WORD p_comma,','
- ;; ( v -- )
- ;; Put cell value onto the heap and advance "HERE"
- dq p_here, p_put, p_literal, 8, p_here, p_put_plus, p_exit
-
- WORD p_Ccomma,'C,'
+ WORD p_Ccomma,'C,',fasm
+ ;; ( c -- )
+ ;; Put byte value onto the heap and advance "HERE"
+ mov rax,qword [p_here_DFA]
+ pop rbx
+ mov byte [rax],bl
+ inc qword [p_here_DFA]
+ next
+
+ WORD p_Wcomma,'W,',fasm
;; ( c -- )
;; Put byte value onto the heap and advance "HERE"
- dq p_here, p_Cput, p_literal, 1, p_here, p_put_plus, p_exit
+ mov rax,qword [p_here_DFA]
+ pop rbx
+ mov word [rax],bx
+ add qword [p_here_DFA],2
+ next
+
+ WORD p_Dcomma,'D,',fasm
+ ;; ( d -- )
+ ;; Put byte value onto the heap and advance "HERE"
+ mov rax,qword [p_here_DFA]
+ pop rbx
+ mov dword [rax],ebx
+ add qword [p_here_DFA],4
+ next
+
+ WORD p_comma,',',fasm
+ ;; ( v -- )
+ ;; Put byte value onto the heap and advance "HERE"
+ mov rax,qword [p_here_DFA]
+ pop rbx
+ mov qword [rax],rbx
+ add qword [p_here_DFA],8
+ next
WORD p_does,"DOES>",fasm,IMMEDIATE
;; ( -- )
add rsi,8
next
- WORD p_literal_string,'S"',fasm,IMMEDIATE ;; " (fool emacs)
+ WORD p_literal_string,'LIT-STRING',fasm
;; ( -- char* n )
- ;; Save string on heap to make available at interpretation
- ;; not for interactive use!!
- cmp qword [p_state_DFA],0
- je p_literal_string_executing
+ ;; Save NUL string length and pointer on heap to make
+ ;; available at interpretation. Not for interactive use!!
+ mov rax,qword [rsi]
+ add rsi,8
+ push rsi
+ add rsi,rax
+ dec rax
+ push rax
+ next
+
+
+ WORD p_literal_string_compile,'S"',fasm,IMMEDIATE ;; " (fool emacs)
+ ;; ( "..." -- )
+ ;; Lay out a LIT-STRING and a NUL string with length
pushr rsi
mov rdi,qword [p_here_DFA]
mov qword [rdi],p_literal_string
DOFORTH p_double_quote
pop rcx
pop rsi
+ inc rcx ; include the terminating NUL in count
mov rdi,qword [p_here_DFA]
mov qword [rdi],rcx
add rdi,8
+ cld
p_literal_string_copy:
dec rcx
jl p_literal_string_copied
popr rsi
next
-p_literal_string_executing:
- mov rax,qword [rsi]
- add rsi,8
- push rsi
- push rax
- add rsi,rax
- next
-
WORD p_state,'STATE',dovariable
;; Interpretation state (0=interpreting, 1=compiling)
dq 0
cmp al,'Z'
jg p_number_alpha
sub al,'A'-10
+ cmp rax,qword [p_base_DFA]
+ jge p_number_BAD
jmp p_number_CONSUME
p_number_alpha:
cmp al,'a'
cmp al,'z'
jg p_number_BAD
sub al,'a'-10
+ cmp rax,qword [p_base_DFA]
+ jge p_number_BAD
jmp p_number_CONSUME
p_number_BAD:
push qword 0
dq p_literal, 1
p_evaluate_stream_BAD:
dq p_Rgt, p_input, p_put ; restore previous stream
- dq p_exit
+ dq p_literal,0, p_state, p_put ; set interactive mode
+ dq p_return
WORD p_colon,':'
;; ( -- )
dq p_tfa2cfa
dq p_put
dq p_right_bracket
- dq p_exit
+ dq p_return
WORD p_semicolon,';',,IMMEDIATE
;; ( -- )
- ;; Lay out p_exit, and set interpreting mode
- dq p_literal, p_exit, p_comma, p_left_bracket, p_exit
+ ;; Lay out p_return, and set interpreting mode
+ dq p_literal, p_return, p_comma, p_left_bracket, p_return
WORD p_immediate,'IMMEDIATE',fasm,IMMEDIATE
;; ( -- )
dq 15000
WORD p_open_file,'OPEN-FILE',fasm
- ;; ( chaz* -- fd )
+ ;; ( chaz* n -- fd )
;; Open the nominated file
pushr rsi
+ add rsp,8 ; drop n ... assuming NUL-ended string
push qword 0
push qword 0
DOFORTH sys_open
next
WORD p_load_file,'LOAD-FILE'
- ;; ( chaz* -- )
+ ;; ( chaz* n -- )
dq p_open_file
dq p_dup, p_0less
BRANCH 1,p_load_file_badfile
dq p_tell, p_dot, p_nl, p_emit
dq p_literal,1
p_load_file_exit:
- dq p_exit
+ dq p_return