1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate *
4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate * with the License.
8*7c478bd9Sstevel@tonic-gate *
9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate *
14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate *
20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate * Copyright (c) 2000 by Sun Microsystems, Inc.
24*7c478bd9Sstevel@tonic-gate * All rights reserved.
25*7c478bd9Sstevel@tonic-gate */
26*7c478bd9Sstevel@tonic-gate
27*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI"
28*7c478bd9Sstevel@tonic-gate
29*7c478bd9Sstevel@tonic-gate #include <stdio.h>
30*7c478bd9Sstevel@tonic-gate #include <stdlib.h>
31*7c478bd9Sstevel@tonic-gate #include <string.h>
32*7c478bd9Sstevel@tonic-gate #include <ctype.h>
33*7c478bd9Sstevel@tonic-gate
34*7c478bd9Sstevel@tonic-gate #include <fcode/private.h>
35*7c478bd9Sstevel@tonic-gate #include <fcode/log.h>
36*7c478bd9Sstevel@tonic-gate
37*7c478bd9Sstevel@tonic-gate int fcode_impl_count = 0;
38*7c478bd9Sstevel@tonic-gate
39*7c478bd9Sstevel@tonic-gate void (*crash_ptr)(fcode_env_t *env) = do_crash;
40*7c478bd9Sstevel@tonic-gate
41*7c478bd9Sstevel@tonic-gate uchar_t
next_bytecode(fcode_env_t * env)42*7c478bd9Sstevel@tonic-gate next_bytecode(fcode_env_t *env)
43*7c478bd9Sstevel@tonic-gate {
44*7c478bd9Sstevel@tonic-gate uchar_t byte;
45*7c478bd9Sstevel@tonic-gate
46*7c478bd9Sstevel@tonic-gate byte = *env->fcode_ptr;
47*7c478bd9Sstevel@tonic-gate env->fcode_ptr += env->fcode_incr;
48*7c478bd9Sstevel@tonic-gate return (byte);
49*7c478bd9Sstevel@tonic-gate }
50*7c478bd9Sstevel@tonic-gate
51*7c478bd9Sstevel@tonic-gate ushort_t
get_next_token(fcode_env_t * env)52*7c478bd9Sstevel@tonic-gate get_next_token(fcode_env_t *env)
53*7c478bd9Sstevel@tonic-gate {
54*7c478bd9Sstevel@tonic-gate ushort_t token = next_bytecode(env);
55*7c478bd9Sstevel@tonic-gate if ((token) && (token < 0x10)) {
56*7c478bd9Sstevel@tonic-gate token = (token << 8) | next_bytecode(env);
57*7c478bd9Sstevel@tonic-gate }
58*7c478bd9Sstevel@tonic-gate env->last_fcode = token;
59*7c478bd9Sstevel@tonic-gate return (token);
60*7c478bd9Sstevel@tonic-gate }
61*7c478bd9Sstevel@tonic-gate
62*7c478bd9Sstevel@tonic-gate ushort_t
get_short(fcode_env_t * env)63*7c478bd9Sstevel@tonic-gate get_short(fcode_env_t *env)
64*7c478bd9Sstevel@tonic-gate {
65*7c478bd9Sstevel@tonic-gate ushort_t u;
66*7c478bd9Sstevel@tonic-gate
67*7c478bd9Sstevel@tonic-gate /*
68*7c478bd9Sstevel@tonic-gate * Logical or DOES NOT guarantee left to right evaluation...
69*7c478bd9Sstevel@tonic-gate */
70*7c478bd9Sstevel@tonic-gate u = next_bytecode(env) << 8;
71*7c478bd9Sstevel@tonic-gate return (u | next_bytecode(env));
72*7c478bd9Sstevel@tonic-gate }
73*7c478bd9Sstevel@tonic-gate
74*7c478bd9Sstevel@tonic-gate uint_t
get_int(fcode_env_t * env)75*7c478bd9Sstevel@tonic-gate get_int(fcode_env_t *env)
76*7c478bd9Sstevel@tonic-gate {
77*7c478bd9Sstevel@tonic-gate uint_t u;
78*7c478bd9Sstevel@tonic-gate
79*7c478bd9Sstevel@tonic-gate /*
80*7c478bd9Sstevel@tonic-gate * Logical or DOES NOT guarantee left to right evaluation...
81*7c478bd9Sstevel@tonic-gate */
82*7c478bd9Sstevel@tonic-gate u = get_short(env) << 16;
83*7c478bd9Sstevel@tonic-gate return (u | get_short(env));
84*7c478bd9Sstevel@tonic-gate }
85*7c478bd9Sstevel@tonic-gate
86*7c478bd9Sstevel@tonic-gate void
expose_acf(fcode_env_t * env,char * name)87*7c478bd9Sstevel@tonic-gate expose_acf(fcode_env_t *env, char *name)
88*7c478bd9Sstevel@tonic-gate {
89*7c478bd9Sstevel@tonic-gate if (name == NULL)
90*7c478bd9Sstevel@tonic-gate name = "<unknown>";
91*7c478bd9Sstevel@tonic-gate EXPOSE_ACF;
92*7c478bd9Sstevel@tonic-gate debug_msg(DEBUG_CONTEXT, "CONTEXT:expose_acf: acf: %p/'%s' %p\n",
93*7c478bd9Sstevel@tonic-gate LINK_TO_ACF(env->lastlink), name, env->current);
94*7c478bd9Sstevel@tonic-gate }
95*7c478bd9Sstevel@tonic-gate
96*7c478bd9Sstevel@tonic-gate void
do_code(fcode_env_t * env,int token,char * name,void (* fn)(fcode_env_t *))97*7c478bd9Sstevel@tonic-gate do_code(fcode_env_t *env, int token, char *name, void (*fn)(fcode_env_t *))
98*7c478bd9Sstevel@tonic-gate {
99*7c478bd9Sstevel@tonic-gate env->table[token].name = name;
100*7c478bd9Sstevel@tonic-gate if (fn == NULL) {
101*7c478bd9Sstevel@tonic-gate env->table[token].apf = NULL;
102*7c478bd9Sstevel@tonic-gate env->table[token].name = name;
103*7c478bd9Sstevel@tonic-gate } else {
104*7c478bd9Sstevel@tonic-gate header(env, name, strlen(name), 0);
105*7c478bd9Sstevel@tonic-gate env->table[token].apf = (acf_t)HERE;
106*7c478bd9Sstevel@tonic-gate COMPILE_TOKEN(fn);
107*7c478bd9Sstevel@tonic-gate expose_acf(env, name);
108*7c478bd9Sstevel@tonic-gate }
109*7c478bd9Sstevel@tonic-gate }
110*7c478bd9Sstevel@tonic-gate
111*7c478bd9Sstevel@tonic-gate void
define_word(fcode_env_t * env,int flag,char * name,void (* fn)(fcode_env_t *))112*7c478bd9Sstevel@tonic-gate define_word(fcode_env_t *env, int flag, char *name, void (*fn)(fcode_env_t *))
113*7c478bd9Sstevel@tonic-gate {
114*7c478bd9Sstevel@tonic-gate header(env, name, strlen(name), flag);
115*7c478bd9Sstevel@tonic-gate COMPILE_TOKEN(fn);
116*7c478bd9Sstevel@tonic-gate expose_acf(env, name);
117*7c478bd9Sstevel@tonic-gate }
118*7c478bd9Sstevel@tonic-gate
119*7c478bd9Sstevel@tonic-gate void
end0(fcode_env_t * env)120*7c478bd9Sstevel@tonic-gate end0(fcode_env_t *env)
121*7c478bd9Sstevel@tonic-gate {
122*7c478bd9Sstevel@tonic-gate env->interpretting = 0;
123*7c478bd9Sstevel@tonic-gate }
124*7c478bd9Sstevel@tonic-gate
125*7c478bd9Sstevel@tonic-gate static void
end1(fcode_env_t * env)126*7c478bd9Sstevel@tonic-gate end1(fcode_env_t *env)
127*7c478bd9Sstevel@tonic-gate {
128*7c478bd9Sstevel@tonic-gate env->interpretting = 0;
129*7c478bd9Sstevel@tonic-gate }
130*7c478bd9Sstevel@tonic-gate
131*7c478bd9Sstevel@tonic-gate void
blit(fcode_env_t * env)132*7c478bd9Sstevel@tonic-gate blit(fcode_env_t *env)
133*7c478bd9Sstevel@tonic-gate {
134*7c478bd9Sstevel@tonic-gate fstack_t d = (int)get_int(env);
135*7c478bd9Sstevel@tonic-gate PUSH(DS, d);
136*7c478bd9Sstevel@tonic-gate literal(env);
137*7c478bd9Sstevel@tonic-gate }
138*7c478bd9Sstevel@tonic-gate
139*7c478bd9Sstevel@tonic-gate void (*bbranch_ptrs[3])(fcode_env_t *env) = {
140*7c478bd9Sstevel@tonic-gate do_bbranch,
141*7c478bd9Sstevel@tonic-gate do_bqbranch,
142*7c478bd9Sstevel@tonic-gate do_bofbranch
143*7c478bd9Sstevel@tonic-gate };
144*7c478bd9Sstevel@tonic-gate
145*7c478bd9Sstevel@tonic-gate void
branch_common(fcode_env_t * env,short direction,fstack_t which,int doswap)146*7c478bd9Sstevel@tonic-gate branch_common(fcode_env_t *env, short direction, fstack_t which, int doswap)
147*7c478bd9Sstevel@tonic-gate {
148*7c478bd9Sstevel@tonic-gate fstack_t *sp;
149*7c478bd9Sstevel@tonic-gate token_t *branch_loc;
150*7c478bd9Sstevel@tonic-gate
151*7c478bd9Sstevel@tonic-gate ASSERT((which < 3) && (which >= 0));
152*7c478bd9Sstevel@tonic-gate which = (fstack_t)&bbranch_ptrs[which];
153*7c478bd9Sstevel@tonic-gate set_temporary_compile(env);
154*7c478bd9Sstevel@tonic-gate COMPILE_TOKEN(which);
155*7c478bd9Sstevel@tonic-gate if (direction >= 0) {
156*7c478bd9Sstevel@tonic-gate bmark(env);
157*7c478bd9Sstevel@tonic-gate if (doswap)
158*7c478bd9Sstevel@tonic-gate swap(env);
159*7c478bd9Sstevel@tonic-gate PUSH(DS, 0);
160*7c478bd9Sstevel@tonic-gate compile_comma(env);
161*7c478bd9Sstevel@tonic-gate } else {
162*7c478bd9Sstevel@tonic-gate
163*7c478bd9Sstevel@tonic-gate /*
164*7c478bd9Sstevel@tonic-gate * We look down the stack for a branch location
165*7c478bd9Sstevel@tonic-gate * that isn't pointing to zero (i.e. a forward branch label).
166*7c478bd9Sstevel@tonic-gate * We move the first one we find to the top of the stack,
167*7c478bd9Sstevel@tonic-gate * which is what gets compiled in with 'compile_comma'.
168*7c478bd9Sstevel@tonic-gate * Not finding a valid branch label is bad.
169*7c478bd9Sstevel@tonic-gate */
170*7c478bd9Sstevel@tonic-gate for (sp = env->ds; sp >= env->ds0; sp--) {
171*7c478bd9Sstevel@tonic-gate branch_loc = (token_t *)*sp;
172*7c478bd9Sstevel@tonic-gate if (branch_loc && *branch_loc) {
173*7c478bd9Sstevel@tonic-gate break;
174*7c478bd9Sstevel@tonic-gate }
175*7c478bd9Sstevel@tonic-gate }
176*7c478bd9Sstevel@tonic-gate if (sp < env->ds0)
177*7c478bd9Sstevel@tonic-gate log_message(MSG_ERROR, "branch_common: back: "
178*7c478bd9Sstevel@tonic-gate "no branch loc on stack\n");
179*7c478bd9Sstevel@tonic-gate else {
180*7c478bd9Sstevel@tonic-gate /* Move branch_loc to top of data stack */
181*7c478bd9Sstevel@tonic-gate for (; sp < env->ds; sp++)
182*7c478bd9Sstevel@tonic-gate *sp = sp[1];
183*7c478bd9Sstevel@tonic-gate *sp = (fstack_t)branch_loc;
184*7c478bd9Sstevel@tonic-gate }
185*7c478bd9Sstevel@tonic-gate env->level--;
186*7c478bd9Sstevel@tonic-gate compile_comma(env);
187*7c478bd9Sstevel@tonic-gate temporary_execute(env);
188*7c478bd9Sstevel@tonic-gate }
189*7c478bd9Sstevel@tonic-gate }
190*7c478bd9Sstevel@tonic-gate
191*7c478bd9Sstevel@tonic-gate void
bbranch(fcode_env_t * env)192*7c478bd9Sstevel@tonic-gate bbranch(fcode_env_t *env)
193*7c478bd9Sstevel@tonic-gate {
194*7c478bd9Sstevel@tonic-gate short offset = (short)get_short(env);
195*7c478bd9Sstevel@tonic-gate
196*7c478bd9Sstevel@tonic-gate branch_common(env, offset, 0, 1);
197*7c478bd9Sstevel@tonic-gate }
198*7c478bd9Sstevel@tonic-gate
199*7c478bd9Sstevel@tonic-gate void
bqbranch(fcode_env_t * env)200*7c478bd9Sstevel@tonic-gate bqbranch(fcode_env_t *env)
201*7c478bd9Sstevel@tonic-gate {
202*7c478bd9Sstevel@tonic-gate short offset = (short)get_short(env);
203*7c478bd9Sstevel@tonic-gate
204*7c478bd9Sstevel@tonic-gate branch_common(env, offset, 1, 0);
205*7c478bd9Sstevel@tonic-gate }
206*7c478bd9Sstevel@tonic-gate
207*7c478bd9Sstevel@tonic-gate void
do_quote(fcode_env_t * env)208*7c478bd9Sstevel@tonic-gate do_quote(fcode_env_t *env)
209*7c478bd9Sstevel@tonic-gate {
210*7c478bd9Sstevel@tonic-gate int len;
211*7c478bd9Sstevel@tonic-gate uchar_t *strptr;
212*7c478bd9Sstevel@tonic-gate
213*7c478bd9Sstevel@tonic-gate strptr = (uchar_t *)IP;
214*7c478bd9Sstevel@tonic-gate len = *strptr;
215*7c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)strptr+1);
216*7c478bd9Sstevel@tonic-gate PUSH(DS, len);
217*7c478bd9Sstevel@tonic-gate strptr += TOKEN_ROUNDUP(len+2);
218*7c478bd9Sstevel@tonic-gate IP = (token_t *)strptr;
219*7c478bd9Sstevel@tonic-gate }
220*7c478bd9Sstevel@tonic-gate
221*7c478bd9Sstevel@tonic-gate void
bquote(fcode_env_t * env)222*7c478bd9Sstevel@tonic-gate bquote(fcode_env_t *env)
223*7c478bd9Sstevel@tonic-gate {
224*7c478bd9Sstevel@tonic-gate char stringbuff[256];
225*7c478bd9Sstevel@tonic-gate int len, count;
226*7c478bd9Sstevel@tonic-gate char *strptr;
227*7c478bd9Sstevel@tonic-gate
228*7c478bd9Sstevel@tonic-gate count = len = next_bytecode(env);
229*7c478bd9Sstevel@tonic-gate if (env->state) {
230*7c478bd9Sstevel@tonic-gate COMPILE_TOKEN("e_ptr);
231*7c478bd9Sstevel@tonic-gate strptr = (char *)HERE;
232*7c478bd9Sstevel@tonic-gate *strptr++ = len;
233*7c478bd9Sstevel@tonic-gate while (count--)
234*7c478bd9Sstevel@tonic-gate *strptr++ = next_bytecode(env);
235*7c478bd9Sstevel@tonic-gate *strptr++ = 0;
236*7c478bd9Sstevel@tonic-gate set_here(env, (uchar_t *)strptr, "bquote");
237*7c478bd9Sstevel@tonic-gate token_roundup(env, "bquote");
238*7c478bd9Sstevel@tonic-gate } else {
239*7c478bd9Sstevel@tonic-gate strptr = stringbuff;
240*7c478bd9Sstevel@tonic-gate while (count--)
241*7c478bd9Sstevel@tonic-gate *strptr++ = next_bytecode(env);
242*7c478bd9Sstevel@tonic-gate *strptr = 0;
243*7c478bd9Sstevel@tonic-gate push_string(env, stringbuff, len);
244*7c478bd9Sstevel@tonic-gate }
245*7c478bd9Sstevel@tonic-gate }
246*7c478bd9Sstevel@tonic-gate
247*7c478bd9Sstevel@tonic-gate char *
get_name(token_t * linkp)248*7c478bd9Sstevel@tonic-gate get_name(token_t *linkp)
249*7c478bd9Sstevel@tonic-gate {
250*7c478bd9Sstevel@tonic-gate char *name, *p;
251*7c478bd9Sstevel@tonic-gate flag_t *fptr = LINK_TO_FLAGS(linkp);
252*7c478bd9Sstevel@tonic-gate int len;
253*7c478bd9Sstevel@tonic-gate char *cptr;
254*7c478bd9Sstevel@tonic-gate
255*7c478bd9Sstevel@tonic-gate if (*fptr & FLAG_NONAME)
256*7c478bd9Sstevel@tonic-gate return (NULL);
257*7c478bd9Sstevel@tonic-gate
258*7c478bd9Sstevel@tonic-gate cptr = (char *)fptr;
259*7c478bd9Sstevel@tonic-gate len = cptr[-1];
260*7c478bd9Sstevel@tonic-gate if (len <= 0 || len > 64 || cptr[-2] != '\0')
261*7c478bd9Sstevel@tonic-gate return (NULL);
262*7c478bd9Sstevel@tonic-gate
263*7c478bd9Sstevel@tonic-gate name = cptr - (len+2);
264*7c478bd9Sstevel@tonic-gate
265*7c478bd9Sstevel@tonic-gate for (p = name; *p != '\0'; p++)
266*7c478bd9Sstevel@tonic-gate if (!isprint(*p))
267*7c478bd9Sstevel@tonic-gate return (NULL);
268*7c478bd9Sstevel@tonic-gate
269*7c478bd9Sstevel@tonic-gate if ((p - name) != len)
270*7c478bd9Sstevel@tonic-gate return (NULL);
271*7c478bd9Sstevel@tonic-gate
272*7c478bd9Sstevel@tonic-gate return (name);
273*7c478bd9Sstevel@tonic-gate }
274*7c478bd9Sstevel@tonic-gate
275*7c478bd9Sstevel@tonic-gate void
header(fcode_env_t * env,char * name,int len,flag_t flag)276*7c478bd9Sstevel@tonic-gate header(fcode_env_t *env, char *name, int len, flag_t flag)
277*7c478bd9Sstevel@tonic-gate {
278*7c478bd9Sstevel@tonic-gate char *strptr;
279*7c478bd9Sstevel@tonic-gate flag_t *fptr;
280*7c478bd9Sstevel@tonic-gate acf_t dptr;
281*7c478bd9Sstevel@tonic-gate extern void add_debug_acf(fcode_env_t *, acf_t);
282*7c478bd9Sstevel@tonic-gate
283*7c478bd9Sstevel@tonic-gate /* Now form the entry in the dictionary */
284*7c478bd9Sstevel@tonic-gate token_roundup(env, "header");
285*7c478bd9Sstevel@tonic-gate dptr = (acf_t)HERE;
286*7c478bd9Sstevel@tonic-gate if (len) {
287*7c478bd9Sstevel@tonic-gate int bytes = len+2+sizeof (flag_t);
288*7c478bd9Sstevel@tonic-gate dptr = (acf_t)(TOKEN_ROUNDUP(HERE+bytes));
289*7c478bd9Sstevel@tonic-gate fptr = LINK_TO_FLAGS(dptr);
290*7c478bd9Sstevel@tonic-gate strptr = (char *)fptr - 1;
291*7c478bd9Sstevel@tonic-gate *strptr-- = len;
292*7c478bd9Sstevel@tonic-gate *strptr-- = 0;
293*7c478bd9Sstevel@tonic-gate while (len)
294*7c478bd9Sstevel@tonic-gate *strptr-- = name[--len];
295*7c478bd9Sstevel@tonic-gate } else {
296*7c478bd9Sstevel@tonic-gate dptr++;
297*7c478bd9Sstevel@tonic-gate fptr = LINK_TO_FLAGS(dptr);
298*7c478bd9Sstevel@tonic-gate flag |= FLAG_NONAME;
299*7c478bd9Sstevel@tonic-gate }
300*7c478bd9Sstevel@tonic-gate *fptr = flag;
301*7c478bd9Sstevel@tonic-gate *dptr = *((acf_t)env->current);
302*7c478bd9Sstevel@tonic-gate env->lastlink = dptr++;
303*7c478bd9Sstevel@tonic-gate set_here(env, (uchar_t *)dptr, "header");
304*7c478bd9Sstevel@tonic-gate
305*7c478bd9Sstevel@tonic-gate if (name_is_debugged(env, name)) {
306*7c478bd9Sstevel@tonic-gate log_message(MSG_INFO, "Turning debug on for %s\n", name);
307*7c478bd9Sstevel@tonic-gate add_debug_acf(env, LINK_TO_ACF(env->lastlink));
308*7c478bd9Sstevel@tonic-gate }
309*7c478bd9Sstevel@tonic-gate debug_msg(DEBUG_HEADER, "Define: '%s' @ %p\n", name, HERE);
310*7c478bd9Sstevel@tonic-gate }
311*7c478bd9Sstevel@tonic-gate
312*7c478bd9Sstevel@tonic-gate void
token_common(fcode_env_t * env,int headered,int visible)313*7c478bd9Sstevel@tonic-gate token_common(fcode_env_t *env, int headered, int visible)
314*7c478bd9Sstevel@tonic-gate {
315*7c478bd9Sstevel@tonic-gate char namebuff[32];
316*7c478bd9Sstevel@tonic-gate int len, count, token;
317*7c478bd9Sstevel@tonic-gate char *strptr, c;
318*7c478bd9Sstevel@tonic-gate
319*7c478bd9Sstevel@tonic-gate strptr = namebuff;
320*7c478bd9Sstevel@tonic-gate if (headered) {
321*7c478bd9Sstevel@tonic-gate len = next_bytecode(env);
322*7c478bd9Sstevel@tonic-gate for (count = 0; count < len; count++) {
323*7c478bd9Sstevel@tonic-gate c = next_bytecode(env);
324*7c478bd9Sstevel@tonic-gate if (count < sizeof (namebuff))
325*7c478bd9Sstevel@tonic-gate *strptr++ = c;
326*7c478bd9Sstevel@tonic-gate }
327*7c478bd9Sstevel@tonic-gate }
328*7c478bd9Sstevel@tonic-gate
329*7c478bd9Sstevel@tonic-gate if (!visible)
330*7c478bd9Sstevel@tonic-gate len = 0;
331*7c478bd9Sstevel@tonic-gate *strptr = 0;
332*7c478bd9Sstevel@tonic-gate token = get_short(env);
333*7c478bd9Sstevel@tonic-gate env->last_token = token;
334*7c478bd9Sstevel@tonic-gate
335*7c478bd9Sstevel@tonic-gate debug_msg(DEBUG_NEW_TOKEN, "Define %s token: '%s' (%x)\n",
336*7c478bd9Sstevel@tonic-gate (visible ? "named" : "headerless"), namebuff, token);
337*7c478bd9Sstevel@tonic-gate
338*7c478bd9Sstevel@tonic-gate header(env, namebuff, len, 0);
339*7c478bd9Sstevel@tonic-gate env->table[token].flags = 0;
340*7c478bd9Sstevel@tonic-gate if (len) {
341*7c478bd9Sstevel@tonic-gate env->table[token].name = MALLOC(len+1);
342*7c478bd9Sstevel@tonic-gate strncpy(env->table[token].name, namebuff, len);
343*7c478bd9Sstevel@tonic-gate } else {
344*7c478bd9Sstevel@tonic-gate env->table[token].name = NULL;
345*7c478bd9Sstevel@tonic-gate }
346*7c478bd9Sstevel@tonic-gate env->last_token = token;
347*7c478bd9Sstevel@tonic-gate }
348*7c478bd9Sstevel@tonic-gate
349*7c478bd9Sstevel@tonic-gate void
named_token(fcode_env_t * env)350*7c478bd9Sstevel@tonic-gate named_token(fcode_env_t *env)
351*7c478bd9Sstevel@tonic-gate {
352*7c478bd9Sstevel@tonic-gate token_common(env, 1, env->fcode_debug);
353*7c478bd9Sstevel@tonic-gate }
354*7c478bd9Sstevel@tonic-gate
355*7c478bd9Sstevel@tonic-gate void
external_token(fcode_env_t * env)356*7c478bd9Sstevel@tonic-gate external_token(fcode_env_t *env)
357*7c478bd9Sstevel@tonic-gate {
358*7c478bd9Sstevel@tonic-gate token_common(env, 1, 1);
359*7c478bd9Sstevel@tonic-gate }
360*7c478bd9Sstevel@tonic-gate
361*7c478bd9Sstevel@tonic-gate void
new_token(fcode_env_t * env)362*7c478bd9Sstevel@tonic-gate new_token(fcode_env_t *env)
363*7c478bd9Sstevel@tonic-gate {
364*7c478bd9Sstevel@tonic-gate token_common(env, 0, 0);
365*7c478bd9Sstevel@tonic-gate }
366*7c478bd9Sstevel@tonic-gate
367*7c478bd9Sstevel@tonic-gate void
offset16(fcode_env_t * env)368*7c478bd9Sstevel@tonic-gate offset16(fcode_env_t *env)
369*7c478bd9Sstevel@tonic-gate {
370*7c478bd9Sstevel@tonic-gate env->offset_incr = 2;
371*7c478bd9Sstevel@tonic-gate }
372*7c478bd9Sstevel@tonic-gate
373*7c478bd9Sstevel@tonic-gate void
minus_one(fcode_env_t * env)374*7c478bd9Sstevel@tonic-gate minus_one(fcode_env_t *env)
375*7c478bd9Sstevel@tonic-gate {
376*7c478bd9Sstevel@tonic-gate PUSH(DS, -1);
377*7c478bd9Sstevel@tonic-gate }
378*7c478bd9Sstevel@tonic-gate
379*7c478bd9Sstevel@tonic-gate void
zero(fcode_env_t * env)380*7c478bd9Sstevel@tonic-gate zero(fcode_env_t *env)
381*7c478bd9Sstevel@tonic-gate {
382*7c478bd9Sstevel@tonic-gate PUSH(DS, 0);
383*7c478bd9Sstevel@tonic-gate }
384*7c478bd9Sstevel@tonic-gate
385*7c478bd9Sstevel@tonic-gate void
one(fcode_env_t * env)386*7c478bd9Sstevel@tonic-gate one(fcode_env_t *env)
387*7c478bd9Sstevel@tonic-gate {
388*7c478bd9Sstevel@tonic-gate PUSH(DS, 1);
389*7c478bd9Sstevel@tonic-gate }
390*7c478bd9Sstevel@tonic-gate
391*7c478bd9Sstevel@tonic-gate void
two(fcode_env_t * env)392*7c478bd9Sstevel@tonic-gate two(fcode_env_t *env)
393*7c478bd9Sstevel@tonic-gate {
394*7c478bd9Sstevel@tonic-gate PUSH(DS, 2);
395*7c478bd9Sstevel@tonic-gate }
396*7c478bd9Sstevel@tonic-gate
397*7c478bd9Sstevel@tonic-gate void
three(fcode_env_t * env)398*7c478bd9Sstevel@tonic-gate three(fcode_env_t *env)
399*7c478bd9Sstevel@tonic-gate {
400*7c478bd9Sstevel@tonic-gate PUSH(DS, 3);
401*7c478bd9Sstevel@tonic-gate }
402*7c478bd9Sstevel@tonic-gate
403*7c478bd9Sstevel@tonic-gate void
version1(fcode_env_t * env)404*7c478bd9Sstevel@tonic-gate version1(fcode_env_t *env)
405*7c478bd9Sstevel@tonic-gate {
406*7c478bd9Sstevel@tonic-gate env->fcode_incr = 1;
407*7c478bd9Sstevel@tonic-gate }
408*7c478bd9Sstevel@tonic-gate
409*7c478bd9Sstevel@tonic-gate static void
start0(fcode_env_t * env)410*7c478bd9Sstevel@tonic-gate start0(fcode_env_t *env)
411*7c478bd9Sstevel@tonic-gate {
412*7c478bd9Sstevel@tonic-gate env->fcode_incr = 1;
413*7c478bd9Sstevel@tonic-gate }
414*7c478bd9Sstevel@tonic-gate
415*7c478bd9Sstevel@tonic-gate static void
start1(fcode_env_t * env)416*7c478bd9Sstevel@tonic-gate start1(fcode_env_t *env)
417*7c478bd9Sstevel@tonic-gate {
418*7c478bd9Sstevel@tonic-gate env->fcode_incr = 1;
419*7c478bd9Sstevel@tonic-gate }
420*7c478bd9Sstevel@tonic-gate
421*7c478bd9Sstevel@tonic-gate void
start2(fcode_env_t * env)422*7c478bd9Sstevel@tonic-gate start2(fcode_env_t *env)
423*7c478bd9Sstevel@tonic-gate {
424*7c478bd9Sstevel@tonic-gate env->fcode_incr = 2;
425*7c478bd9Sstevel@tonic-gate }
426*7c478bd9Sstevel@tonic-gate
427*7c478bd9Sstevel@tonic-gate static void
start4(fcode_env_t * env)428*7c478bd9Sstevel@tonic-gate start4(fcode_env_t *env)
429*7c478bd9Sstevel@tonic-gate {
430*7c478bd9Sstevel@tonic-gate env->fcode_incr = 4;
431*7c478bd9Sstevel@tonic-gate }
432*7c478bd9Sstevel@tonic-gate
433*7c478bd9Sstevel@tonic-gate int
check_fcode_header(char * fname,uchar_t * header,int len)434*7c478bd9Sstevel@tonic-gate check_fcode_header(char *fname, uchar_t *header, int len)
435*7c478bd9Sstevel@tonic-gate {
436*7c478bd9Sstevel@tonic-gate uint32_t length;
437*7c478bd9Sstevel@tonic-gate static char func_name[] = "check_fcode_header";
438*7c478bd9Sstevel@tonic-gate
439*7c478bd9Sstevel@tonic-gate if (len <= 8) {
440*7c478bd9Sstevel@tonic-gate log_message(MSG_ERROR, "%s: '%s' fcode size (%d) <= 8\n",
441*7c478bd9Sstevel@tonic-gate func_name, fname, len);
442*7c478bd9Sstevel@tonic-gate return (0);
443*7c478bd9Sstevel@tonic-gate }
444*7c478bd9Sstevel@tonic-gate if (header[0] != 0xf1 && header[0] != 0xfd) {
445*7c478bd9Sstevel@tonic-gate log_message(MSG_ERROR, "%s: '%s' header[0] is 0x%02x not"
446*7c478bd9Sstevel@tonic-gate " 0xf1/0xfd\n", func_name, fname, header[0]);
447*7c478bd9Sstevel@tonic-gate return (0);
448*7c478bd9Sstevel@tonic-gate }
449*7c478bd9Sstevel@tonic-gate length = (header[4] << 24) | (header[5] << 16) | (header[6] << 8) |
450*7c478bd9Sstevel@tonic-gate header[7];
451*7c478bd9Sstevel@tonic-gate if (length > len) {
452*7c478bd9Sstevel@tonic-gate log_message(MSG_ERROR, "%s: '%s' length (%d) >"
453*7c478bd9Sstevel@tonic-gate " fcode size (%d)\n", func_name, fname, length, len);
454*7c478bd9Sstevel@tonic-gate return (0);
455*7c478bd9Sstevel@tonic-gate }
456*7c478bd9Sstevel@tonic-gate if (length < len) {
457*7c478bd9Sstevel@tonic-gate log_message(MSG_WARN, "%s: '%s' length (%d) <"
458*7c478bd9Sstevel@tonic-gate " fcode size (%d)\n", func_name, fname, length, len);
459*7c478bd9Sstevel@tonic-gate }
460*7c478bd9Sstevel@tonic-gate return (1);
461*7c478bd9Sstevel@tonic-gate }
462*7c478bd9Sstevel@tonic-gate
463*7c478bd9Sstevel@tonic-gate void
byte_load(fcode_env_t * env)464*7c478bd9Sstevel@tonic-gate byte_load(fcode_env_t *env)
465*7c478bd9Sstevel@tonic-gate {
466*7c478bd9Sstevel@tonic-gate uchar_t *fcode_buffer;
467*7c478bd9Sstevel@tonic-gate uchar_t *fcode_ptr;
468*7c478bd9Sstevel@tonic-gate int fcode_incr;
469*7c478bd9Sstevel@tonic-gate int offset_incr;
470*7c478bd9Sstevel@tonic-gate int fcode_xt;
471*7c478bd9Sstevel@tonic-gate int interpretting;
472*7c478bd9Sstevel@tonic-gate int depth;
473*7c478bd9Sstevel@tonic-gate int length;
474*7c478bd9Sstevel@tonic-gate int past_eob = 0;
475*7c478bd9Sstevel@tonic-gate int db;
476*7c478bd9Sstevel@tonic-gate
477*7c478bd9Sstevel@tonic-gate /* save any existing interpret state */
478*7c478bd9Sstevel@tonic-gate fcode_buffer = env->fcode_buffer;
479*7c478bd9Sstevel@tonic-gate fcode_ptr = env->fcode_ptr;
480*7c478bd9Sstevel@tonic-gate fcode_incr = env->fcode_incr;
481*7c478bd9Sstevel@tonic-gate offset_incr = env->offset_incr;
482*7c478bd9Sstevel@tonic-gate interpretting = env->interpretting;
483*7c478bd9Sstevel@tonic-gate depth = DEPTH-2;
484*7c478bd9Sstevel@tonic-gate
485*7c478bd9Sstevel@tonic-gate /* Now init them */
486*7c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "byte-load");
487*7c478bd9Sstevel@tonic-gate fcode_xt = POP(DS);
488*7c478bd9Sstevel@tonic-gate env->fcode_ptr = env->fcode_buffer = (uchar_t *)POP(DS);
489*7c478bd9Sstevel@tonic-gate if (fcode_xt != 1) {
490*7c478bd9Sstevel@tonic-gate log_message(MSG_WARN, "byte-load: ignoring xt\n");
491*7c478bd9Sstevel@tonic-gate }
492*7c478bd9Sstevel@tonic-gate
493*7c478bd9Sstevel@tonic-gate length = (env->fcode_buffer[4] << 24) | (env->fcode_buffer[5] << 16) |
494*7c478bd9Sstevel@tonic-gate (env->fcode_buffer[6] << 8) | env->fcode_buffer[7];
495*7c478bd9Sstevel@tonic-gate if (!check_fcode_header("byte-load", env->fcode_ptr, length))
496*7c478bd9Sstevel@tonic-gate log_message(MSG_WARN, "byte-load: header NOT OK\n");
497*7c478bd9Sstevel@tonic-gate
498*7c478bd9Sstevel@tonic-gate env->fcode_incr = 1;
499*7c478bd9Sstevel@tonic-gate env->offset_incr = 1;
500*7c478bd9Sstevel@tonic-gate env->interpretting = 1;
501*7c478bd9Sstevel@tonic-gate env->level = 0;
502*7c478bd9Sstevel@tonic-gate
503*7c478bd9Sstevel@tonic-gate db = get_interpreter_debug_level() &
504*7c478bd9Sstevel@tonic-gate (DEBUG_BYTELOAD_DS|DEBUG_BYTELOAD_RS|DEBUG_BYTELOAD_TOKENS);
505*7c478bd9Sstevel@tonic-gate debug_msg(db, "byte_load: %p, %d\n", env->fcode_buffer, fcode_xt);
506*7c478bd9Sstevel@tonic-gate debug_msg(db, " header: %x, %x\n",
507*7c478bd9Sstevel@tonic-gate env->fcode_buffer[0], env->fcode_buffer[1]);
508*7c478bd9Sstevel@tonic-gate debug_msg(db, " crc: %x\n",
509*7c478bd9Sstevel@tonic-gate (env->fcode_buffer[2]<<8)|(env->fcode_buffer[3]));
510*7c478bd9Sstevel@tonic-gate debug_msg(db, " length: %x\n", length);
511*7c478bd9Sstevel@tonic-gate env->fcode_ptr += 8;
512*7c478bd9Sstevel@tonic-gate
513*7c478bd9Sstevel@tonic-gate debug_msg(db, "Interpretting: %d\n", env->interpretting);
514*7c478bd9Sstevel@tonic-gate
515*7c478bd9Sstevel@tonic-gate while (env->interpretting) {
516*7c478bd9Sstevel@tonic-gate int token;
517*7c478bd9Sstevel@tonic-gate fcode_token *entry;
518*7c478bd9Sstevel@tonic-gate acf_t apf;
519*7c478bd9Sstevel@tonic-gate
520*7c478bd9Sstevel@tonic-gate if (!past_eob && env->fcode_ptr >= env->fcode_buffer + length) {
521*7c478bd9Sstevel@tonic-gate log_message(MSG_WARN, "byte-load: past EOB\n");
522*7c478bd9Sstevel@tonic-gate past_eob = 1;
523*7c478bd9Sstevel@tonic-gate }
524*7c478bd9Sstevel@tonic-gate
525*7c478bd9Sstevel@tonic-gate env->last_fcode_ptr = env->fcode_ptr;
526*7c478bd9Sstevel@tonic-gate token = get_next_token(env);
527*7c478bd9Sstevel@tonic-gate
528*7c478bd9Sstevel@tonic-gate entry = &env->table[token];
529*7c478bd9Sstevel@tonic-gate apf = entry->apf;
530*7c478bd9Sstevel@tonic-gate
531*7c478bd9Sstevel@tonic-gate DEBUGF(BYTELOAD_DS, output_data_stack(env, MSG_FC_DEBUG));
532*7c478bd9Sstevel@tonic-gate DEBUGF(BYTELOAD_RS, output_return_stack(env, 1, MSG_FC_DEBUG));
533*7c478bd9Sstevel@tonic-gate DEBUGF(BYTELOAD_TOKENS, log_message(MSG_FC_DEBUG,
534*7c478bd9Sstevel@tonic-gate "%s: %04x %03x %s (%x)",
535*7c478bd9Sstevel@tonic-gate ((env->state && (entry->flags & IMMEDIATE) == 0)) ?
536*7c478bd9Sstevel@tonic-gate "Compile" : "Execute",
537*7c478bd9Sstevel@tonic-gate env->last_fcode_ptr - env->fcode_buffer, token,
538*7c478bd9Sstevel@tonic-gate entry->name ? entry->name : "???", entry->flags));
539*7c478bd9Sstevel@tonic-gate if (db)
540*7c478bd9Sstevel@tonic-gate log_message(MSG_FC_DEBUG, "\n");
541*7c478bd9Sstevel@tonic-gate if (apf) {
542*7c478bd9Sstevel@tonic-gate DEBUGF(TOKEN_USAGE, entry->usage++);
543*7c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)apf);
544*7c478bd9Sstevel@tonic-gate if ((env->state) &&
545*7c478bd9Sstevel@tonic-gate ((entry->flags & IMMEDIATE) == 0)) {
546*7c478bd9Sstevel@tonic-gate /* Compile in references */
547*7c478bd9Sstevel@tonic-gate compile_comma(env);
548*7c478bd9Sstevel@tonic-gate } else {
549*7c478bd9Sstevel@tonic-gate execute(env);
550*7c478bd9Sstevel@tonic-gate }
551*7c478bd9Sstevel@tonic-gate }
552*7c478bd9Sstevel@tonic-gate }
553*7c478bd9Sstevel@tonic-gate if (DEPTH != depth) {
554*7c478bd9Sstevel@tonic-gate log_message(MSG_ERROR, "FCODE has net stack change of %d\n",
555*7c478bd9Sstevel@tonic-gate DEPTH-depth);
556*7c478bd9Sstevel@tonic-gate }
557*7c478bd9Sstevel@tonic-gate /* restore old state */
558*7c478bd9Sstevel@tonic-gate env->fcode_ptr = fcode_ptr;
559*7c478bd9Sstevel@tonic-gate env->fcode_buffer = fcode_buffer;
560*7c478bd9Sstevel@tonic-gate env->fcode_incr = fcode_incr;
561*7c478bd9Sstevel@tonic-gate env->offset_incr = offset_incr;
562*7c478bd9Sstevel@tonic-gate env->interpretting = interpretting;
563*7c478bd9Sstevel@tonic-gate }
564*7c478bd9Sstevel@tonic-gate
565*7c478bd9Sstevel@tonic-gate void
btick(fcode_env_t * env)566*7c478bd9Sstevel@tonic-gate btick(fcode_env_t *env)
567*7c478bd9Sstevel@tonic-gate {
568*7c478bd9Sstevel@tonic-gate int token = get_next_token(env);
569*7c478bd9Sstevel@tonic-gate
570*7c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)env->table[token].apf);
571*7c478bd9Sstevel@tonic-gate tick_literal(env);
572*7c478bd9Sstevel@tonic-gate }
573*7c478bd9Sstevel@tonic-gate
574*7c478bd9Sstevel@tonic-gate static void
show_fcode_def(fcode_env_t * env,char * type)575*7c478bd9Sstevel@tonic-gate show_fcode_def(fcode_env_t *env, char *type)
576*7c478bd9Sstevel@tonic-gate {
577*7c478bd9Sstevel@tonic-gate int i = env->last_token;
578*7c478bd9Sstevel@tonic-gate
579*7c478bd9Sstevel@tonic-gate if (get_interpreter_debug_level() & DEBUG_DUMP_TOKENS) {
580*7c478bd9Sstevel@tonic-gate if (env->table[i].name)
581*7c478bd9Sstevel@tonic-gate log_message(MSG_INFO, "%s: %s %03x %p\n", type,
582*7c478bd9Sstevel@tonic-gate env->table[i].name, i, env->table[i].apf);
583*7c478bd9Sstevel@tonic-gate else
584*7c478bd9Sstevel@tonic-gate log_message(MSG_INFO, "%s: <noname> %03x %p\n", type, i,
585*7c478bd9Sstevel@tonic-gate env->table[i].apf);
586*7c478bd9Sstevel@tonic-gate }
587*7c478bd9Sstevel@tonic-gate }
588*7c478bd9Sstevel@tonic-gate
589*7c478bd9Sstevel@tonic-gate void
bcolon(fcode_env_t * env)590*7c478bd9Sstevel@tonic-gate bcolon(fcode_env_t *env)
591*7c478bd9Sstevel@tonic-gate {
592*7c478bd9Sstevel@tonic-gate if (env->state == 0) {
593*7c478bd9Sstevel@tonic-gate env->table[env->last_token].apf = (acf_t)HERE;
594*7c478bd9Sstevel@tonic-gate env->table[env->last_token].flags = 0;
595*7c478bd9Sstevel@tonic-gate show_fcode_def(env, "bcolon");
596*7c478bd9Sstevel@tonic-gate }
597*7c478bd9Sstevel@tonic-gate env->state |= 1;
598*7c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&do_colon);
599*7c478bd9Sstevel@tonic-gate }
600*7c478bd9Sstevel@tonic-gate
601*7c478bd9Sstevel@tonic-gate void
bcreate(fcode_env_t * env)602*7c478bd9Sstevel@tonic-gate bcreate(fcode_env_t *env)
603*7c478bd9Sstevel@tonic-gate {
604*7c478bd9Sstevel@tonic-gate env->table[env->last_token].apf = (acf_t)HERE;
605*7c478bd9Sstevel@tonic-gate show_fcode_def(env, "bcreate");
606*7c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&do_create);
607*7c478bd9Sstevel@tonic-gate expose_acf(env, "<bcreate>");
608*7c478bd9Sstevel@tonic-gate }
609*7c478bd9Sstevel@tonic-gate
610*7c478bd9Sstevel@tonic-gate void
get_token_name(fcode_env_t * env,int token,char ** name,int * len)611*7c478bd9Sstevel@tonic-gate get_token_name(fcode_env_t *env, int token, char **name, int *len)
612*7c478bd9Sstevel@tonic-gate {
613*7c478bd9Sstevel@tonic-gate *name = env->table[token].name;
614*7c478bd9Sstevel@tonic-gate if (*name) {
615*7c478bd9Sstevel@tonic-gate *len = strlen(*name);
616*7c478bd9Sstevel@tonic-gate } else
617*7c478bd9Sstevel@tonic-gate *len = 0;
618*7c478bd9Sstevel@tonic-gate }
619*7c478bd9Sstevel@tonic-gate
620*7c478bd9Sstevel@tonic-gate void
bvalue(fcode_env_t * env)621*7c478bd9Sstevel@tonic-gate bvalue(fcode_env_t *env)
622*7c478bd9Sstevel@tonic-gate {
623*7c478bd9Sstevel@tonic-gate env->table[env->last_token].apf = (acf_t)HERE;
624*7c478bd9Sstevel@tonic-gate show_fcode_def(env, "bvalue");
625*7c478bd9Sstevel@tonic-gate make_common_access(env, 0, 0, 1,
626*7c478bd9Sstevel@tonic-gate env->instance_mode, &noop, &noop, &set_value_actions);
627*7c478bd9Sstevel@tonic-gate }
628*7c478bd9Sstevel@tonic-gate
629*7c478bd9Sstevel@tonic-gate void
bvariable(fcode_env_t * env)630*7c478bd9Sstevel@tonic-gate bvariable(fcode_env_t *env)
631*7c478bd9Sstevel@tonic-gate {
632*7c478bd9Sstevel@tonic-gate env->table[env->last_token].apf = (acf_t)HERE;
633*7c478bd9Sstevel@tonic-gate show_fcode_def(env, "bvariable");
634*7c478bd9Sstevel@tonic-gate PUSH(DS, 0);
635*7c478bd9Sstevel@tonic-gate make_common_access(env, 0, 0, 1,
636*7c478bd9Sstevel@tonic-gate env->instance_mode, &instance_variable, &do_create, NULL);
637*7c478bd9Sstevel@tonic-gate }
638*7c478bd9Sstevel@tonic-gate
639*7c478bd9Sstevel@tonic-gate void
bconstant(fcode_env_t * env)640*7c478bd9Sstevel@tonic-gate bconstant(fcode_env_t *env)
641*7c478bd9Sstevel@tonic-gate {
642*7c478bd9Sstevel@tonic-gate env->table[env->last_token].apf = (acf_t)HERE;
643*7c478bd9Sstevel@tonic-gate show_fcode_def(env, "bconstant");
644*7c478bd9Sstevel@tonic-gate make_common_access(env, 0, 0, 1,
645*7c478bd9Sstevel@tonic-gate env->instance_mode, &do_constant, &do_constant, NULL);
646*7c478bd9Sstevel@tonic-gate }
647*7c478bd9Sstevel@tonic-gate
648*7c478bd9Sstevel@tonic-gate void
bdefer(fcode_env_t * env)649*7c478bd9Sstevel@tonic-gate bdefer(fcode_env_t *env)
650*7c478bd9Sstevel@tonic-gate {
651*7c478bd9Sstevel@tonic-gate env->table[env->last_token].apf = (acf_t)HERE;
652*7c478bd9Sstevel@tonic-gate show_fcode_def(env, "bdefer");
653*7c478bd9Sstevel@tonic-gate
654*7c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)&crash_ptr);
655*7c478bd9Sstevel@tonic-gate make_common_access(env, 0, 0, 1, env->instance_mode,
656*7c478bd9Sstevel@tonic-gate &noop, &noop, &set_defer_actions);
657*7c478bd9Sstevel@tonic-gate }
658*7c478bd9Sstevel@tonic-gate
659*7c478bd9Sstevel@tonic-gate void
bbuffer_colon(fcode_env_t * env)660*7c478bd9Sstevel@tonic-gate bbuffer_colon(fcode_env_t *env)
661*7c478bd9Sstevel@tonic-gate {
662*7c478bd9Sstevel@tonic-gate env->table[env->last_token].apf = (acf_t)HERE;
663*7c478bd9Sstevel@tonic-gate show_fcode_def(env, "buffer:");
664*7c478bd9Sstevel@tonic-gate PUSH(DS, 0);
665*7c478bd9Sstevel@tonic-gate make_common_access(env, 0, 0, 2, env->instance_mode,
666*7c478bd9Sstevel@tonic-gate &noop, &noop, &set_buffer_actions);
667*7c478bd9Sstevel@tonic-gate }
668*7c478bd9Sstevel@tonic-gate
669*7c478bd9Sstevel@tonic-gate void
do_field(fcode_env_t * env)670*7c478bd9Sstevel@tonic-gate do_field(fcode_env_t *env)
671*7c478bd9Sstevel@tonic-gate {
672*7c478bd9Sstevel@tonic-gate fstack_t *d;
673*7c478bd9Sstevel@tonic-gate
674*7c478bd9Sstevel@tonic-gate d = (fstack_t *)WA;
675*7c478bd9Sstevel@tonic-gate TOS += *d;
676*7c478bd9Sstevel@tonic-gate }
677*7c478bd9Sstevel@tonic-gate
678*7c478bd9Sstevel@tonic-gate void
bfield(fcode_env_t * env)679*7c478bd9Sstevel@tonic-gate bfield(fcode_env_t *env)
680*7c478bd9Sstevel@tonic-gate {
681*7c478bd9Sstevel@tonic-gate env->table[env->last_token].apf = (acf_t)HERE;
682*7c478bd9Sstevel@tonic-gate show_fcode_def(env, "bfield");
683*7c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&do_field);
684*7c478bd9Sstevel@tonic-gate over(env);
685*7c478bd9Sstevel@tonic-gate compile_comma(env);
686*7c478bd9Sstevel@tonic-gate add(env);
687*7c478bd9Sstevel@tonic-gate expose_acf(env, "<bfield>");
688*7c478bd9Sstevel@tonic-gate }
689*7c478bd9Sstevel@tonic-gate
690*7c478bd9Sstevel@tonic-gate void
bto(fcode_env_t * env)691*7c478bd9Sstevel@tonic-gate bto(fcode_env_t *env)
692*7c478bd9Sstevel@tonic-gate {
693*7c478bd9Sstevel@tonic-gate btick(env);
694*7c478bd9Sstevel@tonic-gate
695*7c478bd9Sstevel@tonic-gate if (env->state) {
696*7c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&to_ptr);
697*7c478bd9Sstevel@tonic-gate } else {
698*7c478bd9Sstevel@tonic-gate do_set_action(env);
699*7c478bd9Sstevel@tonic-gate }
700*7c478bd9Sstevel@tonic-gate }
701*7c478bd9Sstevel@tonic-gate
702*7c478bd9Sstevel@tonic-gate void
get_token(fcode_env_t * env)703*7c478bd9Sstevel@tonic-gate get_token(fcode_env_t *env)
704*7c478bd9Sstevel@tonic-gate {
705*7c478bd9Sstevel@tonic-gate fstack_t tok;
706*7c478bd9Sstevel@tonic-gate fstack_t immediate = 0;
707*7c478bd9Sstevel@tonic-gate
708*7c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "get-token");
709*7c478bd9Sstevel@tonic-gate tok = POP(DS);
710*7c478bd9Sstevel@tonic-gate tok &= MAX_FCODE;
711*7c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)env->table[tok].apf);
712*7c478bd9Sstevel@tonic-gate if (env->table[tok].flags & IMMEDIATE) immediate = 1;
713*7c478bd9Sstevel@tonic-gate PUSH(DS, immediate);
714*7c478bd9Sstevel@tonic-gate }
715*7c478bd9Sstevel@tonic-gate
716*7c478bd9Sstevel@tonic-gate void
set_token(fcode_env_t * env)717*7c478bd9Sstevel@tonic-gate set_token(fcode_env_t *env)
718*7c478bd9Sstevel@tonic-gate {
719*7c478bd9Sstevel@tonic-gate fstack_t tok;
720*7c478bd9Sstevel@tonic-gate fstack_t immediate;
721*7c478bd9Sstevel@tonic-gate acf_t acf;
722*7c478bd9Sstevel@tonic-gate
723*7c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "set-token");
724*7c478bd9Sstevel@tonic-gate tok = POP(DS);
725*7c478bd9Sstevel@tonic-gate tok &= MAX_FCODE;
726*7c478bd9Sstevel@tonic-gate immediate = POP(DS);
727*7c478bd9Sstevel@tonic-gate acf = (acf_t)POP(DS);
728*7c478bd9Sstevel@tonic-gate if (immediate)
729*7c478bd9Sstevel@tonic-gate env->table[tok].flags |= IMMEDIATE;
730*7c478bd9Sstevel@tonic-gate else
731*7c478bd9Sstevel@tonic-gate env->table[tok].flags &= ~IMMEDIATE;
732*7c478bd9Sstevel@tonic-gate env->table[tok].apf = acf;
733*7c478bd9Sstevel@tonic-gate immediate = env->last_token;
734*7c478bd9Sstevel@tonic-gate env->last_token = tok;
735*7c478bd9Sstevel@tonic-gate show_fcode_def(env, "set_token");
736*7c478bd9Sstevel@tonic-gate env->last_token = immediate;
737*7c478bd9Sstevel@tonic-gate }
738*7c478bd9Sstevel@tonic-gate
739*7c478bd9Sstevel@tonic-gate void
bof(fcode_env_t * env)740*7c478bd9Sstevel@tonic-gate bof(fcode_env_t *env)
741*7c478bd9Sstevel@tonic-gate {
742*7c478bd9Sstevel@tonic-gate short offset = get_short(env);
743*7c478bd9Sstevel@tonic-gate branch_common(env, offset, 2, 0);
744*7c478bd9Sstevel@tonic-gate }
745*7c478bd9Sstevel@tonic-gate
746*7c478bd9Sstevel@tonic-gate void
bcase(fcode_env_t * env)747*7c478bd9Sstevel@tonic-gate bcase(fcode_env_t *env)
748*7c478bd9Sstevel@tonic-gate {
749*7c478bd9Sstevel@tonic-gate env->level++;
750*7c478bd9Sstevel@tonic-gate set_temporary_compile(env);
751*7c478bd9Sstevel@tonic-gate PUSH(DS, 0);
752*7c478bd9Sstevel@tonic-gate }
753*7c478bd9Sstevel@tonic-gate
754*7c478bd9Sstevel@tonic-gate void
bendcase(fcode_env_t * env)755*7c478bd9Sstevel@tonic-gate bendcase(fcode_env_t *env)
756*7c478bd9Sstevel@tonic-gate {
757*7c478bd9Sstevel@tonic-gate COMPILE_TOKEN(env->table[0x46].apf); /* Hack for now... */
758*7c478bd9Sstevel@tonic-gate while (TOS) {
759*7c478bd9Sstevel@tonic-gate bresolve(env);
760*7c478bd9Sstevel@tonic-gate }
761*7c478bd9Sstevel@tonic-gate (void) POP(DS);
762*7c478bd9Sstevel@tonic-gate env->level--;
763*7c478bd9Sstevel@tonic-gate temporary_execute(env);
764*7c478bd9Sstevel@tonic-gate }
765*7c478bd9Sstevel@tonic-gate
766*7c478bd9Sstevel@tonic-gate void
bendof(fcode_env_t * env)767*7c478bd9Sstevel@tonic-gate bendof(fcode_env_t *env)
768*7c478bd9Sstevel@tonic-gate {
769*7c478bd9Sstevel@tonic-gate short offset = get_short(env);
770*7c478bd9Sstevel@tonic-gate branch_common(env, offset, 0, 1);
771*7c478bd9Sstevel@tonic-gate bresolve(env);
772*7c478bd9Sstevel@tonic-gate }
773*7c478bd9Sstevel@tonic-gate
774*7c478bd9Sstevel@tonic-gate void
fcode_revision(fcode_env_t * env)775*7c478bd9Sstevel@tonic-gate fcode_revision(fcode_env_t *env)
776*7c478bd9Sstevel@tonic-gate {
777*7c478bd9Sstevel@tonic-gate /* We are Version 3.0 */
778*7c478bd9Sstevel@tonic-gate PUSH(DS, 0x30000);
779*7c478bd9Sstevel@tonic-gate }
780*7c478bd9Sstevel@tonic-gate
781*7c478bd9Sstevel@tonic-gate void
alloc_mem(fcode_env_t * env)782*7c478bd9Sstevel@tonic-gate alloc_mem(fcode_env_t *env)
783*7c478bd9Sstevel@tonic-gate {
784*7c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 1, "alloc-mem");
785*7c478bd9Sstevel@tonic-gate TOS = (fstack_t)MALLOC((size_t)TOS);
786*7c478bd9Sstevel@tonic-gate if (!TOS) {
787*7c478bd9Sstevel@tonic-gate throw_from_fclib(env, 1, "alloc-mem failed");
788*7c478bd9Sstevel@tonic-gate }
789*7c478bd9Sstevel@tonic-gate }
790*7c478bd9Sstevel@tonic-gate
791*7c478bd9Sstevel@tonic-gate void
free_mem(fcode_env_t * env)792*7c478bd9Sstevel@tonic-gate free_mem(fcode_env_t *env)
793*7c478bd9Sstevel@tonic-gate {
794*7c478bd9Sstevel@tonic-gate void *p;
795*7c478bd9Sstevel@tonic-gate
796*7c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "free-mem");
797*7c478bd9Sstevel@tonic-gate (void) POP(DS);
798*7c478bd9Sstevel@tonic-gate p = (void *) POP(DS);
799*7c478bd9Sstevel@tonic-gate FREE(p);
800*7c478bd9Sstevel@tonic-gate }
801*7c478bd9Sstevel@tonic-gate
802*7c478bd9Sstevel@tonic-gate void
parse_two_int(fcode_env_t * env)803*7c478bd9Sstevel@tonic-gate parse_two_int(fcode_env_t *env)
804*7c478bd9Sstevel@tonic-gate {
805*7c478bd9Sstevel@tonic-gate uint_t lo, hi;
806*7c478bd9Sstevel@tonic-gate char *str;
807*7c478bd9Sstevel@tonic-gate int len;
808*7c478bd9Sstevel@tonic-gate
809*7c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 2, "parse-2int");
810*7c478bd9Sstevel@tonic-gate lo = 0;
811*7c478bd9Sstevel@tonic-gate hi = 0;
812*7c478bd9Sstevel@tonic-gate str = pop_a_string(env, &len);
813*7c478bd9Sstevel@tonic-gate if (len) {
814*7c478bd9Sstevel@tonic-gate if (sscanf(str, "%x,%x", &hi, &lo) != 2) {
815*7c478bd9Sstevel@tonic-gate throw_from_fclib(env, 1, "parse_2int");
816*7c478bd9Sstevel@tonic-gate }
817*7c478bd9Sstevel@tonic-gate }
818*7c478bd9Sstevel@tonic-gate PUSH(DS, lo);
819*7c478bd9Sstevel@tonic-gate PUSH(DS, hi);
820*7c478bd9Sstevel@tonic-gate }
821*7c478bd9Sstevel@tonic-gate
822*7c478bd9Sstevel@tonic-gate void
left_parse_string(fcode_env_t * env)823*7c478bd9Sstevel@tonic-gate left_parse_string(fcode_env_t *env)
824*7c478bd9Sstevel@tonic-gate {
825*7c478bd9Sstevel@tonic-gate char sep, *cptr, *lstr, *rstr;
826*7c478bd9Sstevel@tonic-gate int len, llen, rlen;
827*7c478bd9Sstevel@tonic-gate
828*7c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "left-parse-string");
829*7c478bd9Sstevel@tonic-gate sep = (char)POP(DS);
830*7c478bd9Sstevel@tonic-gate if (TOS == 0) {
831*7c478bd9Sstevel@tonic-gate two_dup(env);
832*7c478bd9Sstevel@tonic-gate return;
833*7c478bd9Sstevel@tonic-gate }
834*7c478bd9Sstevel@tonic-gate lstr = pop_a_string(env, &llen);
835*7c478bd9Sstevel@tonic-gate len = 0;
836*7c478bd9Sstevel@tonic-gate cptr = NULL;
837*7c478bd9Sstevel@tonic-gate while (len < llen) {
838*7c478bd9Sstevel@tonic-gate if (lstr[len] == sep) {
839*7c478bd9Sstevel@tonic-gate cptr = lstr+len;
840*7c478bd9Sstevel@tonic-gate break;
841*7c478bd9Sstevel@tonic-gate }
842*7c478bd9Sstevel@tonic-gate len++;
843*7c478bd9Sstevel@tonic-gate }
844*7c478bd9Sstevel@tonic-gate if (cptr != NULL) {
845*7c478bd9Sstevel@tonic-gate rstr = cptr+1;
846*7c478bd9Sstevel@tonic-gate rlen = lstr + llen - rstr;
847*7c478bd9Sstevel@tonic-gate llen = len;
848*7c478bd9Sstevel@tonic-gate } else {
849*7c478bd9Sstevel@tonic-gate rlen = 0;
850*7c478bd9Sstevel@tonic-gate rstr = lstr;
851*7c478bd9Sstevel@tonic-gate }
852*7c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)rstr);
853*7c478bd9Sstevel@tonic-gate PUSH(DS, rlen);
854*7c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)lstr);
855*7c478bd9Sstevel@tonic-gate PUSH(DS, llen);
856*7c478bd9Sstevel@tonic-gate }
857*7c478bd9Sstevel@tonic-gate
858*7c478bd9Sstevel@tonic-gate /*
859*7c478bd9Sstevel@tonic-gate * (is-user-word) ( name-str name-len xt -- )
860*7c478bd9Sstevel@tonic-gate */
861*7c478bd9Sstevel@tonic-gate void
is_user_word(fcode_env_t * env)862*7c478bd9Sstevel@tonic-gate is_user_word(fcode_env_t *env)
863*7c478bd9Sstevel@tonic-gate {
864*7c478bd9Sstevel@tonic-gate fstack_t xt;
865*7c478bd9Sstevel@tonic-gate char *name;
866*7c478bd9Sstevel@tonic-gate int len;
867*7c478bd9Sstevel@tonic-gate
868*7c478bd9Sstevel@tonic-gate CHECK_DEPTH(env, 3, "(is-user-word)");
869*7c478bd9Sstevel@tonic-gate xt = POP(DS);
870*7c478bd9Sstevel@tonic-gate name = pop_a_string(env, &len);
871*7c478bd9Sstevel@tonic-gate header(env, name, len, 0);
872*7c478bd9Sstevel@tonic-gate COMPILE_TOKEN(&do_alias);
873*7c478bd9Sstevel@tonic-gate COMPILE_TOKEN(xt);
874*7c478bd9Sstevel@tonic-gate expose_acf(env, name);
875*7c478bd9Sstevel@tonic-gate }
876*7c478bd9Sstevel@tonic-gate
877*7c478bd9Sstevel@tonic-gate void
f_error(fcode_env_t * env)878*7c478bd9Sstevel@tonic-gate f_error(fcode_env_t *env)
879*7c478bd9Sstevel@tonic-gate {
880*7c478bd9Sstevel@tonic-gate #if 0
881*7c478bd9Sstevel@tonic-gate env->interpretting = 0;
882*7c478bd9Sstevel@tonic-gate log_message(MSG_ERROR, "Uniplemented FCODE token encountered %x\n",
883*7c478bd9Sstevel@tonic-gate env->last_fcode);
884*7c478bd9Sstevel@tonic-gate #else
885*7c478bd9Sstevel@tonic-gate forth_abort(env, "Unimplemented FCODE token: 0x%x\n", env->last_fcode);
886*7c478bd9Sstevel@tonic-gate #endif
887*7c478bd9Sstevel@tonic-gate }
888*7c478bd9Sstevel@tonic-gate
889*7c478bd9Sstevel@tonic-gate static void
fcode_buffer_addr(fcode_env_t * env)890*7c478bd9Sstevel@tonic-gate fcode_buffer_addr(fcode_env_t *env)
891*7c478bd9Sstevel@tonic-gate {
892*7c478bd9Sstevel@tonic-gate PUSH(DS, (fstack_t)(env->fcode_buffer));
893*7c478bd9Sstevel@tonic-gate }
894*7c478bd9Sstevel@tonic-gate
895*7c478bd9Sstevel@tonic-gate #pragma init(_init)
896*7c478bd9Sstevel@tonic-gate
897*7c478bd9Sstevel@tonic-gate static void
_init(void)898*7c478bd9Sstevel@tonic-gate _init(void)
899*7c478bd9Sstevel@tonic-gate {
900*7c478bd9Sstevel@tonic-gate fcode_env_t *env = initial_env;
901*7c478bd9Sstevel@tonic-gate
902*7c478bd9Sstevel@tonic-gate ASSERT(env);
903*7c478bd9Sstevel@tonic-gate NOTICE;
904*7c478bd9Sstevel@tonic-gate
905*7c478bd9Sstevel@tonic-gate P1275(0x000, DEFINER, "end0", end0);
906*7c478bd9Sstevel@tonic-gate P1275(0x010, DEFINER, "b(lit)", blit);
907*7c478bd9Sstevel@tonic-gate P1275(0x011, DEFINER, "b(')", btick);
908*7c478bd9Sstevel@tonic-gate P1275(0x012, DEFINER, "b(\")", bquote);
909*7c478bd9Sstevel@tonic-gate P1275(0x013, DEFINER, "bbranch", bbranch);
910*7c478bd9Sstevel@tonic-gate P1275(0x014, DEFINER, "b?branch", bqbranch);
911*7c478bd9Sstevel@tonic-gate P1275(0x015, DEFINER, "b(loop)", bloop);
912*7c478bd9Sstevel@tonic-gate P1275(0x016, DEFINER, "b(+loop)", bplusloop);
913*7c478bd9Sstevel@tonic-gate P1275(0x017, DEFINER, "b(do)", bdo);
914*7c478bd9Sstevel@tonic-gate P1275(0x018, DEFINER, "b(?do)", bqdo);
915*7c478bd9Sstevel@tonic-gate P1275(0x01b, DEFINER, "b(leave)", bleave);
916*7c478bd9Sstevel@tonic-gate P1275(0x01c, DEFINER, "b(of)", bof);
917*7c478bd9Sstevel@tonic-gate
918*7c478bd9Sstevel@tonic-gate P1275(0x087, 0, "fcode-revision", fcode_revision);
919*7c478bd9Sstevel@tonic-gate
920*7c478bd9Sstevel@tonic-gate P1275(0x08b, 0, "alloc-mem", alloc_mem);
921*7c478bd9Sstevel@tonic-gate P1275(0x08c, 0, "free-mem", free_mem);
922*7c478bd9Sstevel@tonic-gate
923*7c478bd9Sstevel@tonic-gate P1275(0x0a4, 0, "-1", minus_one);
924*7c478bd9Sstevel@tonic-gate P1275(0x0a5, 0, "0", zero);
925*7c478bd9Sstevel@tonic-gate P1275(0x0a6, 0, "1", one);
926*7c478bd9Sstevel@tonic-gate P1275(0x0a7, 0, "2", two);
927*7c478bd9Sstevel@tonic-gate P1275(0x0a8, 0, "3", three);
928*7c478bd9Sstevel@tonic-gate
929*7c478bd9Sstevel@tonic-gate P1275(0x0ae, 0, "aligned", aligned);
930*7c478bd9Sstevel@tonic-gate P1275(0x0b1, DEFINER, "b(<mark)", bmark);
931*7c478bd9Sstevel@tonic-gate P1275(0x0b2, DEFINER, "b(>resolve)", bresolve);
932*7c478bd9Sstevel@tonic-gate FCODE(0x0b3, 0, "set-token-table", fc_historical);
933*7c478bd9Sstevel@tonic-gate FCODE(0x0b4, 0, "set-table", fc_historical);
934*7c478bd9Sstevel@tonic-gate P1275(0x0b5, 0, "new-token", new_token);
935*7c478bd9Sstevel@tonic-gate P1275(0x0b6, 0, "named-token", named_token);
936*7c478bd9Sstevel@tonic-gate P1275(0x0b7, DEFINER, "b(:)", bcolon);
937*7c478bd9Sstevel@tonic-gate P1275(0x0b8, DEFINER, "b(value)", bvalue);
938*7c478bd9Sstevel@tonic-gate P1275(0x0b9, DEFINER, "b(variable)", bvariable);
939*7c478bd9Sstevel@tonic-gate P1275(0x0ba, DEFINER, "b(constant)", bconstant);
940*7c478bd9Sstevel@tonic-gate P1275(0x0bb, DEFINER, "b(create)", bcreate);
941*7c478bd9Sstevel@tonic-gate P1275(0x0bc, DEFINER, "b(defer)", bdefer);
942*7c478bd9Sstevel@tonic-gate P1275(0x0bd, 0, "b(buffer:)", bbuffer_colon);
943*7c478bd9Sstevel@tonic-gate P1275(0x0be, 0, "b(field)", bfield);
944*7c478bd9Sstevel@tonic-gate FCODE(0x0bf, 0, "b(code)", fc_historical);
945*7c478bd9Sstevel@tonic-gate P1275(0x0c0, IMMEDIATE, "instance", instance);
946*7c478bd9Sstevel@tonic-gate
947*7c478bd9Sstevel@tonic-gate P1275(0x0c2, DEFINER, "b(;)", semi);
948*7c478bd9Sstevel@tonic-gate P1275(0x0c3, DEFINER, "b(to)", bto);
949*7c478bd9Sstevel@tonic-gate P1275(0x0c4, DEFINER, "b(case)", bcase);
950*7c478bd9Sstevel@tonic-gate P1275(0x0c5, DEFINER, "b(endcase)", bendcase);
951*7c478bd9Sstevel@tonic-gate P1275(0x0c6, DEFINER, "b(endof)", bendof);
952*7c478bd9Sstevel@tonic-gate
953*7c478bd9Sstevel@tonic-gate P1275(0x0ca, 0, "external-token", external_token);
954*7c478bd9Sstevel@tonic-gate P1275(0x0cc, 0, "offset16", offset16);
955*7c478bd9Sstevel@tonic-gate P1275(0x0cd, 0, "evaluate", evaluate);
956*7c478bd9Sstevel@tonic-gate
957*7c478bd9Sstevel@tonic-gate P1275(0x0da, 0, "get-token", get_token);
958*7c478bd9Sstevel@tonic-gate P1275(0x0db, 0, "set-token", set_token);
959*7c478bd9Sstevel@tonic-gate
960*7c478bd9Sstevel@tonic-gate P1275(0x0f0, 0, "start0", start0);
961*7c478bd9Sstevel@tonic-gate P1275(0x0f1, 0, "start1", start1);
962*7c478bd9Sstevel@tonic-gate P1275(0x0f2, 0, "start2", start2);
963*7c478bd9Sstevel@tonic-gate P1275(0x0f3, 0, "start4", start4);
964*7c478bd9Sstevel@tonic-gate
965*7c478bd9Sstevel@tonic-gate P1275(0x0fd, 0, "version1", version1);
966*7c478bd9Sstevel@tonic-gate FCODE(0x0fe, 0, "4-byte-id", fc_historical);
967*7c478bd9Sstevel@tonic-gate
968*7c478bd9Sstevel@tonic-gate P1275(0x0ff, 0, "end1", end1);
969*7c478bd9Sstevel@tonic-gate
970*7c478bd9Sstevel@tonic-gate /* Call it "old-dma-alloc" so no one gets confused */
971*7c478bd9Sstevel@tonic-gate FCODE(0x101, 0, "old-dma-alloc", fc_historical);
972*7c478bd9Sstevel@tonic-gate
973*7c478bd9Sstevel@tonic-gate FCODE(0x104, 0, "memmap", fc_historical);
974*7c478bd9Sstevel@tonic-gate FCODE(0x105, 0, "free-virtual", fc_unimplemented);
975*7c478bd9Sstevel@tonic-gate
976*7c478bd9Sstevel@tonic-gate FCODE(0x106, 0, ">physical", fc_historical);
977*7c478bd9Sstevel@tonic-gate
978*7c478bd9Sstevel@tonic-gate FCODE(0x10f, 0, "my-params", fc_historical);
979*7c478bd9Sstevel@tonic-gate
980*7c478bd9Sstevel@tonic-gate P1275(0x11b, 0, "parse-2int", parse_two_int);
981*7c478bd9Sstevel@tonic-gate
982*7c478bd9Sstevel@tonic-gate FCODE(0x122, 0, "memory-test-suite", fc_unimplemented);
983*7c478bd9Sstevel@tonic-gate FCODE(0x123, 0, "group-code", fc_historical);
984*7c478bd9Sstevel@tonic-gate FCODE(0x124, 0, "mask", fc_unimplemented);
985*7c478bd9Sstevel@tonic-gate
986*7c478bd9Sstevel@tonic-gate FCODE(0x130, 0, "map-low", fc_unimplemented);
987*7c478bd9Sstevel@tonic-gate FCODE(0x131, 0, "sbus-intr>cpu", fc_unimplemented);
988*7c478bd9Sstevel@tonic-gate
989*7c478bd9Sstevel@tonic-gate FCODE(0x170, 0, "fb1-draw-character", fc_historical);
990*7c478bd9Sstevel@tonic-gate FCODE(0x171, 0, "fb1-reset-screen", fc_historical);
991*7c478bd9Sstevel@tonic-gate FCODE(0x172, 0, "fb1-toggle-cursor", fc_historical);
992*7c478bd9Sstevel@tonic-gate FCODE(0x173, 0, "fb1-erase-screen", fc_historical);
993*7c478bd9Sstevel@tonic-gate FCODE(0x174, 0, "fb1-blink-screen", fc_historical);
994*7c478bd9Sstevel@tonic-gate FCODE(0x175, 0, "fb1-invert-screen", fc_historical);
995*7c478bd9Sstevel@tonic-gate FCODE(0x176, 0, "fb1-insert-characters", fc_historical);
996*7c478bd9Sstevel@tonic-gate FCODE(0x177, 0, "fb1-delete-characters", fc_historical);
997*7c478bd9Sstevel@tonic-gate FCODE(0x178, 0, "fb1-insert-lines", fc_historical);
998*7c478bd9Sstevel@tonic-gate FCODE(0x179, 0, "fb1-delete-lines", fc_historical);
999*7c478bd9Sstevel@tonic-gate FCODE(0x17a, 0, "fb1-draw-logo", fc_historical);
1000*7c478bd9Sstevel@tonic-gate FCODE(0x17b, 0, "fb1-install", fc_historical);
1001*7c478bd9Sstevel@tonic-gate FCODE(0x17c, 0, "fb1-slide-up", fc_historical);
1002*7c478bd9Sstevel@tonic-gate
1003*7c478bd9Sstevel@tonic-gate FCODE(0x190, 0, "VME-bus Support", fc_obsolete);
1004*7c478bd9Sstevel@tonic-gate FCODE(0x191, 0, "VME-bus Support", fc_obsolete);
1005*7c478bd9Sstevel@tonic-gate FCODE(0x192, 0, "VME-bus Support", fc_obsolete);
1006*7c478bd9Sstevel@tonic-gate FCODE(0x193, 0, "VME-bus Support", fc_obsolete);
1007*7c478bd9Sstevel@tonic-gate FCODE(0x194, 0, "VME-bus Support", fc_obsolete);
1008*7c478bd9Sstevel@tonic-gate FCODE(0x195, 0, "VME-bus Support", fc_obsolete);
1009*7c478bd9Sstevel@tonic-gate FCODE(0x196, 0, "VME-bus Support", fc_obsolete);
1010*7c478bd9Sstevel@tonic-gate
1011*7c478bd9Sstevel@tonic-gate FCODE(0x1a0, 0, "return-buffer", fc_historical);
1012*7c478bd9Sstevel@tonic-gate FCODE(0x1a1, 0, "xmit-packet", fc_historical);
1013*7c478bd9Sstevel@tonic-gate FCODE(0x1a2, 0, "poll-packet", fc_historical);
1014*7c478bd9Sstevel@tonic-gate
1015*7c478bd9Sstevel@tonic-gate FCODE(0x210, 0, "processor-type", fc_historical);
1016*7c478bd9Sstevel@tonic-gate FCODE(0x211, 0, "firmware-version", fc_historical);
1017*7c478bd9Sstevel@tonic-gate FCODE(0x212, 0, "fcode-version", fc_historical);
1018*7c478bd9Sstevel@tonic-gate
1019*7c478bd9Sstevel@tonic-gate FCODE(0x214, 0, "(is-user-word)", is_user_word);
1020*7c478bd9Sstevel@tonic-gate FCODE(0x215, 0, "suspend-fcode", fc_unimplemented);
1021*7c478bd9Sstevel@tonic-gate
1022*7c478bd9Sstevel@tonic-gate FCODE(0x229, 0, "adr-mask", fc_historical);
1023*7c478bd9Sstevel@tonic-gate
1024*7c478bd9Sstevel@tonic-gate FCODE(0x238, 0, "probe", fc_historical);
1025*7c478bd9Sstevel@tonic-gate FCODE(0x239, 0, "probe-virtual", fc_historical);
1026*7c478bd9Sstevel@tonic-gate
1027*7c478bd9Sstevel@tonic-gate P1275(0x23e, 0, "byte-load", byte_load);
1028*7c478bd9Sstevel@tonic-gate
1029*7c478bd9Sstevel@tonic-gate P1275(0x240, 0, "left-parse-string", left_parse_string);
1030*7c478bd9Sstevel@tonic-gate FORTH(0, "fcode-buffer", fcode_buffer_addr);
1031*7c478bd9Sstevel@tonic-gate }
1032