Mercurial > repos > rhope
annotate runtime/builtinworkers.c @ 189:d0e3a13c1bd9 default tip
Remove old calculator example
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 07 Oct 2011 00:24:04 -0700 |
parents | ba35ab624ec2 |
children |
rev | line source |
---|---|
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 Func(Build, |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
2 NumParams 1, |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
3 NumOutputs 1) |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 Param(0, TYPE_BLUEPRINT) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
7 lv(Build, bp) = ((t_Blueprint *)(my_params(0)))->bp; |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
8 release_ref(my_params(0)); |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
10 Ret(0, new_object_bp(lv(Build, bp))) |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 EndFunc(Build) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 Func(BlueprintSP_Of, |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
15 NumParams 1, |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
16 NumOutputs 1) |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
18 lv(BlueprintSP_Of, bp) = get_blueprint(my_params(0)); |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
19 release_ref(my_params(0)); |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 Ret(0, new_object(TYPE_BLUEPRINT)) |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
22 ((t_Blueprint *)my_outputs(0))->bp = lv(BlueprintSP_Of, bp); |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 EndFunc(BlueprintSP_Of) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
26 Func(ID, NumParams 1, NumOutputs 1) |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 Param(0, TYPE_BLUEPRINT) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
30 lv(ID, id) = new_object(TYPE_UINT32); |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
31 ((t_UInt32 *)lv(ID, id))->Num = ((t_Blueprint *)my_params(0))->bp->type_id; |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
32 release_ref(my_params(0)); |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
33 Ret(0, lv(ID, id)) |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 EndFunc(ID) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
37 Func(BlueprintSP_FromSP_ID, NumParams 1, NumOutputs 2) |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 Param(0, TYPE_UINT32) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
41 lv(BlueprintSP_FromSP_ID, type) = ((t_UInt32 *)my_params(0))->Num; |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
42 if (lv(BlueprintSP_FromSP_ID, type) >= max_registered_type || !registered_types[lv(BlueprintSP_FromSP_ID, type)]) { |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
43 Ret(1, my_params(0)) |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 Ret(0, NULL) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 } else { |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
46 release_ref(my_params(0)); |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 Ret(0, new_object(TYPE_BLUEPRINT)) |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
48 ((t_Blueprint *)my_outputs(0))->bp = registered_types[lv(BlueprintSP_FromSP_ID, type)]; |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 Ret(1, NULL) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 } |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 EndFunc(BlueprintSP_FromSP_ID) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
55 #ifndef RAW_FUNC |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
56 FuncNoLocals(Pause, NumParams 1, NumOutputs 1) |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 Param(0, TYPE_WORKER) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 ct->resume_cdata = my_cdata; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 ct->resumeable = 1; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 temp_ct = ct; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 ct = new_context(); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 VCPrepCall(my_cdata->params[0], 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 VCSetParam(my_cdata->params[0], 0, make_Context(temp_ct)) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 ValCallNoLocals(my_cdata->params[0], 1, 1, Pause) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 release_ref(my_cdata->params[0]); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 ValCallNoLocalsPostlude(1, Pause) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
69 for(idx = 0; idx < cdata->num_params; ++idx) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 if(cdata->params[idx]) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
71 { release_ref(cdata->params[idx]); } |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 free_context(ct); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
73 ct = get_cqueue(); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 if (!ct) goto NOTHING_TO_DO; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 cdata = ct->resume_cdata; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 ct->resume_cdata = NULL; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 EndFuncNoLocals |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
80 FuncNoLocals(Resume, NumParams 2, NumOutputs 2) |
162
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 Param(0, TYPE_CONTEXT) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 temp_ct = ((t_Context *)my_cdata->params[0])->ct; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 release_ref(my_cdata->params[0]); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 if(temp_ct->resumeable && temp_ct->resume_cdata) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 temp_ct->resumeable = 0; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 temp_ct->resume_cdata->params[0] = add_ref(my_cdata->params[1]); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 my_cdata->params[0] = my_cdata->params[1]; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 my_cdata->params[1] = NULL; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
91 if(!put_cqueue(temp_ct)) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
92 { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
93 ct->resume_cdata = my_cdata; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
94 temp_ct->runafter = ct; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 ct = temp_ct; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 cdata = ct->resume_cdata; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
97 ct->resume_cdata = NULL; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
98 } |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 } else { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 my_cdata->params[0] = NULL; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 } |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 EndFuncNoLocals |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
104 |
176 | 105 f_RunSP_Bytecode: |
106 sf_RunSP_Bytecode: | |
107 Param(0, TYPE_ARRAY) | |
108 Param(1, TYPE_BOXEDARRAY) | |
109 | |
110 if(((t_Array *)cdata->params[0])->payload.Eltype->bp->type_id != TYPE_UINT32) | |
111 { | |
112 printf("Array has element type of %d, but bytecode must be an array with element type UInt32\n", ((t_Array *)cdata->params[0])->payload.Eltype->bp->type_id); | |
113 goto _exception; | |
114 } | |
115 my_cdata = cdata; | |
116 bytecode = (uint32_t *)(((t_Array *)cdata->params[0])+1); | |
117 for(idx = 2; idx < (bytecode[0]+2); ++idx) | |
118 if(bytecode[idx+1]) | |
119 { | |
120 Param(idx, bytecode[idx+1]) | |
121 } | |
122 cur_instruction = bytecode+idx; | |
123 while(idx < cdata->num_params) | |
124 release_ref(cdata->params[idx++]); | |
125 cdata->num_params = bytecode[0]; | |
126 interp_consts = (object **)(((t_BoxedSP_Array *)cdata->params[1])+1); | |
177
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
127 lv_RunSP_Bytecode = alloc_stack(ct, sizeof(object *)*(bytecode[1]+1+bytecode[0])); |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
128 memcpy(lv_RunSP_Bytecode + 1, cdata->params+2, bytecode[0]*sizeof(object *)); |
176 | 129 |
130 PrepCall(bytecode[2]) | |
131 | |
132 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
133 interp_call: | |
134 *lv_RunSP_Bytecode = cur_instruction; | |
135 | |
136 cdata->func = RES_1_RunSP_Bytecode; | |
137 cdata->num_params = *cur_instruction >> 24; | |
138 cdata->vars = lv_RunSP_Bytecode; | |
139 func = *cur_instruction >> 4 & 0xFFFFF; | |
140 DISPATCH | |
141 r1_RunSP_Bytecode: | |
142 my_cdata = cdata->lastframe; | |
143 lv_RunSP_Bytecode = cdata->vars; | |
144 | |
145 interp_consts = (object **)(((t_BoxedSP_Array *)my_cdata->params[1])+1); | |
146 cur_instruction = *lv_RunSP_Bytecode; | |
147 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
148 interp_param: | |
149 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
150 SetParam(*cur_instruction >> 24, op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) | |
151 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
152 interp_load: | |
153 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
154 accum = op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]; | |
155 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
156 interp_and: | |
157 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
158 op2 = *cur_instruction >> 18; | |
159 if (!op1) | |
160 { | |
161 accum = accum && (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
162 } else { | |
163 accum = (op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) && (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
164 } | |
165 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
166 interp_or: | |
167 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
168 op2 = *cur_instruction >> 18; | |
169 if (!op1) | |
170 { | |
171 accum = accum || (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
172 } else { | |
173 accum = (op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) || (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
174 } | |
175 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
176 interp_not: | |
177 accum = !accum; | |
178 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
179 interp_branch: | |
177
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
180 if (!accum) |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
181 if (*cur_instruction & 0x10) |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
182 cur_instruction -= *cur_instruction >> 5; |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
183 else |
176 | 184 cur_instruction += *cur_instruction >> 5; |
185 else | |
186 cur_instruction++; | |
177
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
187 goto *interp_dispatch[*cur_instruction&0xF]; |
176 | 188 interp_saveresult: |
189 op1 = (*cur_instruction >> 4) & 0x1FFF; | |
190 lv_RunSP_Bytecode[op1] = cdata->params[*cur_instruction >> 24]; | |
191 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
192 interp_addref: | |
193 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
194 add_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : (object *)lv_RunSP_Bytecode[op1]); | |
195 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
196 interp_release: | |
197 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
198 release_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]); | |
199 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
177
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
200 interp_move: |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
201 op1 = (*cur_instruction >> 4) & 0x1FFF; |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
202 op2 = *cur_instruction >> 18; |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
203 if (op1) |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
204 lv_RunSP_Bytecode[op1] = op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]; |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
205 else |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
206 accum = op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]; |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
207 goto *interp_dispatch[*(++cur_instruction)&0xF]; |
176 | 208 interp_nop: |
177
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
209 goto *interp_dispatch[*(++cur_instruction)&0xF]; |
176 | 210 interp_return: |
211 FreeCall | |
212 release_ref(my_cdata->params[0]); | |
213 release_ref(my_cdata->params[1]); | |
214 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
215 op2 = *cur_instruction >> 24; | |
216 for (idx = 0; idx < op2; ++idx) | |
217 { | |
218 Ret(idx, lv_RunSP_Bytecode[op1+idx]) | |
219 } | |
220 EndFunc(RunSP_Bytecode) | |
221 DISPATCH | |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
222 #else |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
223 FuncNoLocals(Pause, NumParams 1, NumOutputs 0) |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
224 exit(2); |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
225 EndFuncNoLocals |
176 | 226 |
186
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
227 FuncNoLocals(Resume, NumParams 2, NumOutputs 0) |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
228 exit(2); |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
229 EndFuncNoLocals |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
230 |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
231 FuncNoLocals(RunSP_Bytecode, NumParams 2, NumOutputs 0) |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
232 exit(2); |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
233 EndFuncNoLocals |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
234 #endif //RAW_FUNC |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
235 |
ba35ab624ec2
Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
Mike Pavone <pavone@retrodev.com>
parents:
177
diff
changeset
|
236 |