;;; * 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 )
push rax
jmp exit
+ WORD p_clear_stream,'CLEAR-STREAM',fasm
+ ;; ( stream -- )
+ ;; Clear buffer of input stream
+ pop rax
+ mov rbx,qword [rax+16] ; copy fill
+ mov qword [rax+24],rbx ; into current
+ next
+
;;; ========================================
;;; Stream reading
;;; READ-STREAM-CHAR ( stream -- ch )
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
+ 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 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