Mercurial > repos > rhope
annotate runtime/builtinworkers.c @ 184:c6ba9fe45910
Strip _c from filenames of current compiler
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 27 Jul 2011 21:28:43 -0700 |
parents | e57c151f351e |
children | ba35ab624ec2 |
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, |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 NumParams 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 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
|
5 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 lv_Build->bp = ((t_Blueprint *)(cdata->params[0]))->bp; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 release_ref(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
|
8 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 Ret(0, new_object_bp(lv_Build->bp)) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 EndFunc(Build) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 Func(BlueprintSP_Of, |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 NumParams 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 lv_BlueprintSP_Of->bp = get_blueprint(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
|
17 release_ref(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
|
18 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 Ret(0, new_object(TYPE_BLUEPRINT)) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 ((t_Blueprint *)cdata->params[0])->bp = lv_BlueprintSP_Of->bp; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 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
|
22 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 Func(ID, NumParams 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 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
|
27 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 lv_ID->id = new_object(TYPE_UINT32); |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 ((t_UInt32 *)lv_ID->id)->Num = ((t_Blueprint *)cdata->params[0])->bp->type_id; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 release_ref(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
|
31 Ret(0, lv_ID->id) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 EndFunc(ID) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 Func(BlueprintSP_FromSP_ID, NumParams 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 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
|
38 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 lv_BlueprintSP_FromSP_ID->type = ((t_UInt32 *)cdata->params[0])->Num; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 if (lv_BlueprintSP_FromSP_ID->type >= max_registered_type || !registered_types[lv_BlueprintSP_FromSP_ID->type]) { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 Ret(1, 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
|
42 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
|
43 } else { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 release_ref(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
|
45 Ret(0, new_object(TYPE_BLUEPRINT)) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 ((t_Blueprint *)cdata->params[0])->bp = registered_types[lv_BlueprintSP_FromSP_ID->type]; |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 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
|
48 } |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 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
|
51 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 FuncNoLocals(Pause, NumParams 1) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 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
|
55 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 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
|
57 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
|
58 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
|
59 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
|
60 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
|
61 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
|
62 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
|
63 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
|
64 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 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
|
66 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
|
67 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
|
68 { 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
|
69 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
|
70 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
|
71 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
|
72 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
|
73 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
|
74 EndFuncNoLocals |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 FuncNoLocals(Resume, NumParams 2) |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 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
|
79 |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 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
|
81 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
|
82 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
|
83 { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 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
|
85 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
|
86 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
|
87 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
|
88 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
|
89 { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 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
|
91 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
|
92 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
|
93 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
|
94 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
|
95 } |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 } else { |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
97 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
|
98 } |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 EndFuncNoLocals |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 DISPATCH |
bac2c74801f0
Move some C code out of cbackend_c.rhope into separate include files
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 |
176 | 102 f_RunSP_Bytecode: |
103 sf_RunSP_Bytecode: | |
104 Param(0, TYPE_ARRAY) | |
105 Param(1, TYPE_BOXEDARRAY) | |
106 | |
107 if(((t_Array *)cdata->params[0])->payload.Eltype->bp->type_id != TYPE_UINT32) | |
108 { | |
109 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); | |
110 goto _exception; | |
111 } | |
112 my_cdata = cdata; | |
113 bytecode = (uint32_t *)(((t_Array *)cdata->params[0])+1); | |
114 for(idx = 2; idx < (bytecode[0]+2); ++idx) | |
115 if(bytecode[idx+1]) | |
116 { | |
117 Param(idx, bytecode[idx+1]) | |
118 } | |
119 cur_instruction = bytecode+idx; | |
120 while(idx < cdata->num_params) | |
121 release_ref(cdata->params[idx++]); | |
122 cdata->num_params = bytecode[0]; | |
123 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
|
124 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
|
125 memcpy(lv_RunSP_Bytecode + 1, cdata->params+2, bytecode[0]*sizeof(object *)); |
176 | 126 |
127 PrepCall(bytecode[2]) | |
128 | |
129 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
130 interp_call: | |
131 *lv_RunSP_Bytecode = cur_instruction; | |
132 | |
133 cdata->func = RES_1_RunSP_Bytecode; | |
134 cdata->num_params = *cur_instruction >> 24; | |
135 cdata->vars = lv_RunSP_Bytecode; | |
136 func = *cur_instruction >> 4 & 0xFFFFF; | |
137 DISPATCH | |
138 r1_RunSP_Bytecode: | |
139 my_cdata = cdata->lastframe; | |
140 lv_RunSP_Bytecode = cdata->vars; | |
141 | |
142 interp_consts = (object **)(((t_BoxedSP_Array *)my_cdata->params[1])+1); | |
143 cur_instruction = *lv_RunSP_Bytecode; | |
144 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
145 interp_param: | |
146 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
147 SetParam(*cur_instruction >> 24, op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) | |
148 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
149 interp_load: | |
150 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
151 accum = op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]; | |
152 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
153 interp_and: | |
154 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
155 op2 = *cur_instruction >> 18; | |
156 if (!op1) | |
157 { | |
158 accum = accum && (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
159 } else { | |
160 accum = (op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) && (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
161 } | |
162 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
163 interp_or: | |
164 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
165 op2 = *cur_instruction >> 18; | |
166 if (!op1) | |
167 { | |
168 accum = accum || (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
169 } else { | |
170 accum = (op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) || (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]); | |
171 } | |
172 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
173 interp_not: | |
174 accum = !accum; | |
175 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
176 interp_branch: | |
177
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
177 if (!accum) |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
178 if (*cur_instruction & 0x10) |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
179 cur_instruction -= *cur_instruction >> 5; |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
180 else |
176 | 181 cur_instruction += *cur_instruction >> 5; |
182 else | |
183 cur_instruction++; | |
177
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
184 goto *interp_dispatch[*cur_instruction&0xF]; |
176 | 185 interp_saveresult: |
186 op1 = (*cur_instruction >> 4) & 0x1FFF; | |
187 lv_RunSP_Bytecode[op1] = cdata->params[*cur_instruction >> 24]; | |
188 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
189 interp_addref: | |
190 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
191 add_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : (object *)lv_RunSP_Bytecode[op1]); | |
192 goto *interp_dispatch[*(++cur_instruction)&0xF]; | |
193 interp_release: | |
194 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
195 release_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]); | |
196 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
|
197 interp_move: |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
198 op1 = (*cur_instruction >> 4) & 0x1FFF; |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
199 op2 = *cur_instruction >> 18; |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
200 if (op1) |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
201 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
|
202 else |
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
203 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
|
204 goto *interp_dispatch[*(++cur_instruction)&0xF]; |
176 | 205 interp_nop: |
177
e57c151f351e
Get bytecode engine working well enough for naive fib
Mike Pavone <pavone@retrodev.com>
parents:
176
diff
changeset
|
206 goto *interp_dispatch[*(++cur_instruction)&0xF]; |
176 | 207 interp_return: |
208 FreeCall | |
209 release_ref(my_cdata->params[0]); | |
210 release_ref(my_cdata->params[1]); | |
211 op1 = (*cur_instruction >> 4) & 0x3FFF; | |
212 op2 = *cur_instruction >> 24; | |
213 for (idx = 0; idx < op2; ++idx) | |
214 { | |
215 Ret(idx, lv_RunSP_Bytecode[op1+idx]) | |
216 } | |
217 EndFunc(RunSP_Bytecode) | |
218 DISPATCH | |
219 |