;;; * block address
;;; * -1
;;; * size of block
-;;; * current read position (starts at 8 = after block size)
+;;; * current read position
WORD p_stream,'STREAM',fasm
;; ( fd size -- addr ) or ( block -1 -- addr )
popr rsi
next
-p_emit_buffer: dq 0
-
WORD p_emit,'EMIT',fasm
;; ( c -- )
;; Write byte to stdout
pushr rsi
- pop rax
- mov [p_emit_buffer],al
+ mov rax,rsp
push 1
- push p_emit_buffer
+ push rax
push 1
DOFORTH sys_write
- pop rax
+ pop rax ; ignore return value
+ pop rax ; drop input data
popr rsi
next
;; ( -- c )
;; Pushes a space character on the stack
dq 10
-
+
+ WORD p_digits,'DIGITS',dovariable
+ db '0123456789abcdef'
+
+ WORD p_dot,'.',fasm
+ ;; ( v -- )
+ ;; Print TOP value as unsigned BASE integer
+ pushr rsi
+ mov rax,qword [rsp]
+ cmp rax,0
+ jge p_dot_positive
+ cmp qword [p_base_DFA],10
+ jne p_dot_positive
+ push '-'
+ DOFORTH p_emit
+ mov rax,qword [rsp]
+ neg rax
+p_dot_positive:
+ xor rdx,rdx
+ div qword [p_base_DFA] ; rdx:rax / BASE => q=rax, r=rdx
+ mov qword [rsp],rdx
+ cmp rax,0
+ je p_dot_remainder
+ push rax
+ DOFORTH p_dot
+p_dot_remainder:
+ pop rdx
+ xor rax,rax
+ mov al,[p_digits_DFA+rdx]
+ push rax
+ DOFORTH p_emit
+ popr rsi
+ next