1 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; and now
for something completely different
...
5 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 VOCABULARY
(LOCALS
-SUPPORT
)
9 ALSO
(LOCALS
-SUPPORT
) DEFINITIONS
11 ;; offset in temp
(user
) dict
12 ;; should be enough
for now
;-)
13 65536 CONSTANT LOCALS
-TEMP
-VOC
-OFFSET
15 0 VALUE LOCALS
-DP
-TEMP
18 : NEW
-LOCALS
-WORDLIST
( -- )
19 FORTH
:(DP
-TEMP
) @
;; save it
20 FORTH
:(ADDR
-TEMP
-BIT
) LOCALS
-TEMP
-VOC
-OFFSET
+ FORTH
:(DP
-TEMP
) !
21 0 FALSE FORTH
:(NEW
-WORDLIST
) TO LOCALS
-VOCID
22 HERE
TO LOCALS
-DP
-TEMP
27 ;; low byte of loccount is total number of locals
28 ;; high byte is the number of args
30 : LATEST
-HAS
-LOCALS?
( -- bool
)
31 LATEST
-PFA DUP HERE
= IF DROP FALSE
32 ELSE @
['] FORTH:(L-ENTER) =
38 LATEST-HAS-LOCALS? " \`locals:\` or \`args:\` should be the first word" ?NOT-ERROR
40 NEW-LOCALS-WORDLIST COMPILE FORTH:(L-ENTER) 0 ,
44 : ADD-LOCAL ( addr count -- )
46 LATEST-PFA CELL+ DUP C@ 255 = " too many locals" ?ERROR
47 1 OVER +! C@ >R ;; save current local number to RSTACK
48 ;; now create access word
49 FORTH:(DP-TEMP) @ CURRENT @
50 LOCALS-DP-TEMP FORTH:(DP-TEMP) ! LOCALS-VOCID CURRENT !
51 \ ." DP: " FORTH:(DP) @ . CR
52 \ ." DP-TEMP: " FORTH:(DP-TEMP) @ . CR
53 \ ." HERE: " HERE . CR
56 COMPILER:(CREATE-HEADER)
57 COMPILER:(CFAIDX-DO-CONST) , ;; why not
60 FORTH:(DP-TEMP) @ HERE <> " WTF?!" ?ERROR ;; assertion
61 HERE TO LOCALS-DP-TEMP
63 CURRENT ! FORTH:(DP-TEMP) !
66 ;; create local access words, adjust "(L-ENTER)"
67 : ADD-ARG ( addr count -- )
68 ADD-LOCAL 0x01_00 LATEST-PFA CELL+ +!
71 : PARSE-LOC-LIST ( regcfa -- )
73 PARSE-SKIP-LINE-COMMENTS
82 ..: FORTH:(EXIT-EXTENDER) ( -- )
83 LATEST-HAS-LOCALS? IF COMPILE FORTH:(L-LEAVE) ENDIF
87 : FIND-LOCAL ( addr count -- addr count FALSE / idx TRUE )
90 2DUP 1 > SWAP C@ [CHAR] : = AND IF
91 LATEST-HAS-LOCALS? IF ( addr count | ret-flag )
92 OVER 1+ OVER 1- LOCALS-VOCID FIND-WORD-IN-VOC
94 >R 2DROP R> CFA->PFA @
102 ..: FORTH:(TO-EXTENDER) ( addr count FALSE -- addr count FALSE / TRUE )
105 FIND-LOCAL IF LITERAL COMPILE FORTH:(LOCAL!) TRUE
113 ..: FORTH:(INTERPRET-CHECK-WORD) ( addr count FALSE -- addr count FALSE / TRUE )
116 FIND-LOCAL IF LITERAL COMPILE FORTH:(LOCAL@) TRUE
127 : ARGS: ['] (LOCALS
-SUPPORT
):ADD
-ARG
(LOCALS
-SUPPORT
):PARSE
-LOC
-LIST
; IMMEDIATE
128 : LOCALS
: ['] (LOCALS-SUPPORT):ADD-LOCAL (LOCALS-SUPPORT):PARSE-LOC-LIST ; IMMEDIATE