+
+ WORD p_fdtell,'FDTELL',
+ ;; ( chars* n fd -- )
+ ;; Write n bytes from chars* to fd
+ dq p_rot, p_rot, sys_write, p_drop, p_exit
+
+ WORD p_tell,'TELL'
+ ;; ( chars* n -- )
+ ;; Write n bytes from chars* to stdout
+ dq p_literal,1,p_fdtell, p_exit
+
+ WORD p_fdemit,'FDEMIT'
+ ;; ( c fd -- )
+ ;; Write byte to fd
+ dq p_literal,1, p_dsp, p_literal,1, sys_write, p_2drop, p_exit
+
+ WORD p_emit,'EMIT'
+ ;; ( c -- )
+ ;; Write byte to stdout
+ dq p_literal,1, p_fdemit, p_exit
+
+ 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
+ pop rax
+ cmp rax,0
+ jge p_dot_positive
+ cmp qword [p_base_DFA],10
+ jne p_dot_positive
+ mov byte[rdi],'-'
+ inc rdi
+ neg rax
+p_dot_positive:
+ call p_dot_pad_subr
+ xor rax,rax
+ stosb
+ push p_pad_DFA
+ sub rdi,p_pad_DFA
+ push rdi
+ DOFORTH p_str2temp
+ dec qword [rsp] ; don't count the ending NUL
+ popr rsi
+ next
+
+p_dot_pad_subr: ;
+ xor rdx,rdx
+ div qword [p_base_DFA] ; rdx:rax / BASE => q=rax, r=rdx
+ cmp rax,0
+ je p_dot_remainder
+ push rdx
+ call p_dot_pad_subr
+ pop rdx
+p_dot_remainder:
+ xor rax,rax
+ mov al,[p_digits_DFA+rdx]
+ stosb
+ ret
+
+ WORD p_dot,'.'
+ ;; ( v -- )
+ ;; Print value to stdout
+ dq p_dot_temp, p_literal,1, p_fdtell, p_exit