+ xor rbx,rbx
+ mov rax,qword [rsp+8]
+ mov rcx,qword [rsp]
+ mov [rax+rcx],bl ; add NUL ending
+ inc qword [rsp]
+ DOFORTH p_str2temp
+ dec qword [rsp]
+ popr rax
+ popr rsi
+ next
+
+p_read_word_skipline:
+ DOFORTH p_Rget, p_read_stream_char
+ pop rbx
+ cmp bl,0
+ jl p_read_word_nomore
+ cmp bl,10 ; newline
+ je p_read_word_skipblanks
+ jmp p_read_word_skipline
+
+ WORD p_double_quote,'"',fasm ;; " (fool emacs)
+ ;; ( -- char* n )
+ ;; Scan to double quote in stream buffer, putting the string
+ ;; on PAD, plus an extra NUL, then copy that into a new temp
+ ;; object, but exclude the NUL from the returned count, n.
+ pushr rsi
+ push p_pad_DFA
+ push 0
+p_double_quote_loop:
+ DOFORTH p_input, p_get, p_read_stream_char
+ pop rax
+ cmp rax,0
+ jl p_double_quote_endstream
+ cmp rax,'"' ; " (fool emacs)
+ je p_double_quote_endquote
+ lea rdi,[p_pad_DFA]
+ add rdi,qword [rsp]
+ stosb
+ inc qword [rsp]
+ jmp p_double_quote_loop
+p_double_quote_endquote:
+p_double_quote_endstream:
+ lea rdi,[p_pad_DFA]
+ add rdi,qword [rsp]
+ mov byte [rdi],0
+ ;; copy PAD string + NUL into new temp object
+ inc qword [rsp]
+ DOFORTH p_str2temp
+ dec qword [rsp]
+ popr rsi
+ next
+
+ WORD p_fdtell,'FDTELL',
+ ;; ( chars* n fd -- )
+ ;; Write n bytes from chars* to fd
+ dq p_rot, p_rot, sys_write, p_drop, p_return
+
+ WORD p_tell,'TELL'
+ ;; ( chars* n -- )
+ ;; Write n bytes from chars* to stdout
+ dq p_literal,1,p_fdtell, p_return
+
+ WORD p_fdemit,'FDEMIT'
+ ;; ( c fd -- )
+ ;; Write byte to fd
+ dq p_literal,1, p_dsp, p_literal,1, sys_write, p_2drop, p_return
+
+ WORD p_emit,'EMIT'
+ ;; ( c -- )
+ ;; Write byte to stdout
+ dq p_literal,1, p_fdemit, p_return
+
+ WORD p_nl,'NL',dovalue
+ ;; ( -- c )
+ ;; Pushes a newline character on the stack
+ dq 10
+
+ WORD p_sp,'SP',dovalue
+ ;; ( -- c )
+ ;; Pushes a space character on the stack
+ dq 32
+
+ WORD p_digits,'DIGITS',dovariable
+ db '0123456789abcdef'
+
+ WORD p_dot_temp,'.TEMP',fasm
+ ;; ( v -- )
+ ;; Print TOP value as unsigned BASE integer
+ pushr rsi
+ mov rdi,p_pad_DFA