From: Ralph Ronnquist Date: Tue, 18 May 2021 05:18:27 +0000 (+1000) Subject: added short string macro X-Git-Url: https://git.rrq.au/?a=commitdiff_plain;h=69125f1514739aa5dcee13a29eb161a229e47eed;p=rrq%2Frrqforth.git added short string macro --- diff --git a/machine.asm b/machine.asm index 058da15..a8bfbd8 100644 --- a/machine.asm +++ b/machine.asm @@ -142,7 +142,7 @@ label#_DFA: } ;;; ======================================== -;;; The block macro lays out the length for a subsequent block to the +;;; The BLOCK macro lays out the length for a subsequent block to the ;;; given label. macro BLOCK endlabel { local datastart @@ -150,3 +150,16 @@ macro BLOCK endlabel { datastart: } +;;; ======================================== +;;; The STRING macro lays out length byte and data for s short string +macro STRING [data] { +common + local datastart, dataend + db dataend - datastart +datastart: +forward + db data +common +dataend: + } + diff --git a/rrqforth.asm b/rrqforth.asm index 41bab41..9709fde 100644 --- a/rrqforth.asm +++ b/rrqforth.asm @@ -26,6 +26,14 @@ DS_TOP: ; The initial rsp ;; exit to the calling definition via "jmp exit". jmp qword rsi + WORD p_exit, 'EXIT',fasm + ;; ( -- ) ( R: addr -- ) + ;; Returns execution to the calling definition as per the + ;; return stack. +exit: + popr rsi + next + ;;; Execution semantics for FORTH defition word ;;; At entry, rsi points into the calling definition, at the cell ;;; following the cell indicating this word, rax points to the CFA of @@ -35,33 +43,36 @@ doforth: lea rsi, [rax+8] ; rsi = the DFA of the rax word next - WORD p_exit, 'EXIT',fasm - ;; ( -- ) ( R: addr -- ) - ;; Returns execution to the calling definition as per the - ;; return stack. -exit: - popr rsi +;;; Execution semantics for DOES> +;;; The cell at [cfa-8] holds an adjustment offset. +dodoes: + pushr rsi + lea rsi, [rax+8] ; rsi = the DFA of the rax word + add rsi,[rax-8] ; adjust rsi to the DOES> part next ;; Execution semantics for a variable ( -- addr ) - ;; rax points to doer field + ;; rax points to CFA field dovariable: - push rax+16 + add rax,8 + push rax next ;; Execution semantics for a constant ( -- v ) - ;; rax points to doer field + ;; rax points to CFA field dovalue: - push qword [rax+16] + push qword [rax+8] next ;; Execution semantics for a string constant ( -- addr n ) - ;; rax points to doer field + ;; rax points to CFA field dostring: - add rax,16 + add rax,8 + xor rbx,rbx mov bl,[rax] - mov byte [rsp],bl - push rax+1 + inc rax + push rax + push rbx next include 'wordlists.asm' @@ -72,10 +83,7 @@ include 'math.asm' include 'stdio.asm' WORD p_program_version,'PROGRAM_VERSION',dostring - db length -program_version_string: - db 'RRQ Forth version 0.1 - 2021-05-13',10 - length = $ - program_version_string + STRING 'RRQ Forth version 0.1 - 2021-05-13',10 WORD p_stdin,'STDIN',dovalue ;; Initialised to hold a STREAM for fd 0 @@ -101,8 +109,7 @@ main: ENDFORTH push qword 1 ; stdout - push qword program_version_string ; address of string - push qword length ; length of string (cheating) + DOFORTH p_program_version ; version string => ( s n ) DOFORTH sys_write ; printout pop rax ; ignore errors