annotate runtime/builtinworkers.c @ 176:327bcf35e094

Add bytecode interpreter
author Mike Pavone <pavone@retrodev.com>
date Wed, 08 Jun 2011 23:24:29 -0700
parents bac2c74801f0
children e57c151f351e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
102 f_RunSP_Bytecode:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
103 sf_RunSP_Bytecode:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
104 Param(0, TYPE_ARRAY)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
105 Param(1, TYPE_BOXEDARRAY)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
106
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
107 if(((t_Array *)cdata->params[0])->payload.Eltype->bp->type_id != TYPE_UINT32)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
108 {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
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);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
110 goto _exception;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
111 }
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
112 my_cdata = cdata;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
113 bytecode = (uint32_t *)(((t_Array *)cdata->params[0])+1);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
114 for(idx = 2; idx < (bytecode[0]+2); ++idx)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
115 if(bytecode[idx+1])
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
116 {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
117 Param(idx, bytecode[idx+1])
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
118 }
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
119 cur_instruction = bytecode+idx;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
120 while(idx < cdata->num_params)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
121 release_ref(cdata->params[idx++]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
122 cdata->num_params = bytecode[0];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
123 interp_consts = (object **)(((t_BoxedSP_Array *)cdata->params[1])+1);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
124 lv_RunSP_Bytecode = alloc_stack(ct, sizeof(object *)*(bytecode[1]+1));
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
125
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
126 PrepCall(bytecode[2])
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
127
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
128 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
129 interp_call:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
130 *lv_RunSP_Bytecode = cur_instruction;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
131
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
132 cdata->func = RES_1_RunSP_Bytecode;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
133 cdata->num_params = *cur_instruction >> 24;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
134 cdata->vars = lv_RunSP_Bytecode;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
135 func = *cur_instruction >> 4 & 0xFFFFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
136 DISPATCH
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
137 r1_RunSP_Bytecode:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
138 my_cdata = cdata->lastframe;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
139 lv_RunSP_Bytecode = cdata->vars;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
140
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
141 interp_consts = (object **)(((t_BoxedSP_Array *)my_cdata->params[1])+1);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
142 cur_instruction = *lv_RunSP_Bytecode;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
143 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
144 interp_param:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
145 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
146 SetParam(*cur_instruction >> 24, op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1])
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
147 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
148 interp_load:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
149 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
150 accum = op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
151 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
152 interp_and:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
153 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
154 op2 = *cur_instruction >> 18;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
155 if (!op1)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
156 {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
157 accum = accum && (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
158 } else {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
159 accum = (op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) && (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
160 }
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
161 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
162 interp_or:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
163 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
164 op2 = *cur_instruction >> 18;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
165 if (!op1)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
166 {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
167 accum = accum || (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
168 } else {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
169 accum = (op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]) || (op2 >= 0x2000 ? interp_consts[op2-0x2000] : lv_RunSP_Bytecode[op2]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
170 }
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
171 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
172 interp_not:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
173 accum = !accum;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
174 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
175 interp_branch:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
176 if (accum)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
177 if (*cur_instruction & 0x8)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
178 cur_instruction += *cur_instruction >> 5;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
179 else
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
180 cur_instruction -= *cur_instruction >> 5;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
181 else
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
182 cur_instruction++;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
183 goto *interp_dispatch[*cur_instruction];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
184 interp_saveresult:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
185 op1 = (*cur_instruction >> 4) & 0x1FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
186 lv_RunSP_Bytecode[op1] = cdata->params[*cur_instruction >> 24];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
187 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
188 interp_addref:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
189 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
190 add_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : (object *)lv_RunSP_Bytecode[op1]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
191 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
192 interp_release:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
193 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
194 release_ref(op1 >= 0x2000 ? interp_consts[op1-0x2000] : lv_RunSP_Bytecode[op1]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
195 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
196 interp_nop:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
197 goto *interp_dispatch[*(++cur_instruction)&0xF];
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
198 interp_return:
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
199 FreeCall
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
200 release_ref(my_cdata->params[0]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
201 release_ref(my_cdata->params[1]);
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
202 op1 = (*cur_instruction >> 4) & 0x3FFF;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
203 op2 = *cur_instruction >> 24;
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
204 for (idx = 0; idx < op2; ++idx)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
205 {
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
206 Ret(idx, lv_RunSP_Bytecode[op1+idx])
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
207 }
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
208 EndFunc(RunSP_Bytecode)
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
209 DISPATCH
327bcf35e094 Add bytecode interpreter
Mike Pavone <pavone@retrodev.com>
parents: 162
diff changeset
210