1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; UrForth level
1: self
-hosting
32-bit Forth compiler
3 ;; Copyright
(C
) 2020 Ketmar Dark
// Invisible Vector
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
20 mov ERP
,ts
:[ua_ofs_rp0
]
25 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
26 code: RDUP ( -- | n -- n n )
32 code: RDROP ( -- | n -- )
37 code: >R ( n -- | -- n )
43 code: R> ( -- n | n -- )
49 code: R@ ( -- n | n -- n )
56 code: 2RDROP ( -- | n0 n1 -- )
61 code: 2>R ( n0 n1 -- | -- n0 n1 )
69 code: 2R> ( -- n0 n1 | n0 n1 -- )
77 code: 2R@ ( -- n0 n1 | n0 n1 )
85 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
86 code: RDEPTH ( -- rstack-depth-before-this-call )
88 ld TOS
,ts
:[ua_ofs_rp0
]
95 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
96 ;; remove idx
, copy item from
return stack
; 0 RPICK is the same as R@
97 code: RPICK ( idx -- n[rtop-idx-1] )
104 ;; remove idx and val
, set nth item
(numbered as in RPICK
)
105 code: RPOKE ( val idx -- )
113 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
114 code: NRDROP ( cells -- )
121 code: RALLOCA ( bytes -- addr )
129 code: RDEALLOCA ( bytes -- )
138 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
139 ;; local variables support code
140 ;; it can be implemented without asm
(and
"libs/locals.f" contains such implementation
),
141 ;; but i moved it here
for speed reasons
146 ;; dd prevlocptr
-- locptr points here
148 code: free-local-frame ( -- )
149 ld eax
,ts
:[ua_ofs_locptr
]
150 ld edx
,[eax
] ;; prevlocptr
151 ld ts
:[ua_ofs_locptr
],edx
152 lea ERP
,[eax
+4] ;; drop local frame
155 (* reference implementation
:
156 : free
-local
-frame
( -- ) (locptr@
) dup @
(locptr
!) cell
+ r
> swap rp
! >r
;
160 ;; allocate local frame on rstack
, copy args
, zero uncopied slots
161 ;; totalcells should include one cell
for prevlocptr
162 code: alloc-local-frame ( argcells totalcells -- )
163 lea edx
,[ERP
-4] ;; new locptr
167 ld eax
,ts
:[ua_ofs_locptr
]
168 ld
[edx
],eax
;; set prevlocptr
169 ld ts
:[ua_ofs_locptr
],edx
190 (* reference implementation
:
191 : alloc
-local
-frame
( argcells totalcells
-- )
193 rp@ r
> 2over ralloca
2drop
>r
194 (locptr@
) over
! dup
(locptr
!)
197 ?dup
if >r sp@
(locptr@
) r@
1- cells dup swap
- swap cmove r
> dealloca
endif
202 code: (local-addr) ( cellofs -- addr )
203 ld eax
,ts
:[ua_ofs_locptr
]
209 code: (local-load) ( cellofs -- value )
210 ld eax
,ts
:[ua_ofs_locptr
]