comparison interp.h @ 0:76568becd6d6

Rhope Alpha 2a source import
author Mike Pavone <pavone@retrodev.com>
date Tue, 28 Apr 2009 23:06:07 +0000
parents
children 20d40cb8abf3
comparison
equal deleted inserted replaced
-1:000000000000 0:76568becd6d6
1 #ifndef _INTERP_H_
2 #define _INTERP_H_
3
4 #ifdef WIN32
5 #include <windows.h>
6 #endif
7
8 #ifndef BOOL
9 #define BOOL short
10 #define TRUE 1
11 #define FALSE 0
12 #endif
13
14 #ifndef DWORD
15 #define DWORD unsigned long
16 #endif
17
18 #ifndef WINAPI
19 #define WINAPI
20 #endif
21
22 #ifndef LPVOID
23 #define LPVOID void *
24 #endif
25 #ifndef NULL
26 #define NULL 0
27 #endif
28 #include "vis_threading.h"
29 #include "structs.h"
30 #include "debugmacros.h"
31
32 #define CONSTANT 0
33 #define ROOM 1
34 #define WORKER 2
35 #define INPUT 3
36 #define OUTPUT 4
37 #define SET_COMP 5
38 #define GET_COMP 6
39 #define SET_GLOBAL 7
40 #define GET_GLOBAL 8
41 #define TAIL_CALL 9
42 #define TAIL_RECURSE 10
43
44 #define RECTANGLE 1
45 #define TRAPEZOID 2
46
47
48 #define WORKER_TYPE 0
49 #define MAGIC_TYPE 1
50 #define USER_FLAG 0x8000
51 #define TYPE_MASK 0xFF
52
53 #define START_COMP_STORAGE 40
54 #define START_DEF_STORAGE 100
55
56 #ifdef CPLUSPLUS
57 extern "C" {
58 #endif
59
60 //extern company companylist[];
61 //extern int num_companies;
62 extern BOOL execute_active;
63 extern int program_count;
64 VIS_EXTERN_CRITICAL_SECTION(program_count_lock)
65
66 void main_callback(worker_instance * junkinst, int junk, worker_instance * main_instance, void * data);
67
68 void optimize(worker_def * def);
69 void run_optimized(worker_instance * instance, datum ** params);
70 datum * get_constant(char * value, int len, program * prog);
71 int execute_def(worker_def * process_def, queue_entry worker_entry, datum ** params, instance_callback callback);
72 int execute_def_data(worker_def * process_def, queue_entry worker_entry, datum ** params, instance_callback callback, void * data);
73 BOOL execute_def_wait(worker_def * def, datum ** params);
74 int process_worker(queue_entry aworker);
75 void initworkers(program * prog);
76 void initpredefworkers(program * prog);
77 DWORD WINAPI worker_thread(LPVOID param);
78 void interp_start(int num_threads, BOOL use_this_thread, int argc, char ** argv, program * initial_prog);
79 void interp_stop();
80 void add_if_ready(int workerNum, worker_instance * instance);
81 void make_lookup_arrays(program * prog);
82 void def_make_lookup(worker_def * def);
83 queue_entry get_queue();
84 void add_queue(int data, worker_instance * instance);
85 void add_multiple(int * data, int num, worker_instance * instance);
86 void init_sync_primitives();
87 void init_global_storage();
88 void pack_list_sub_callback(worker_instance * caller_instance, int caller_workernum, worker_instance * done_instance, void * data);
89 worker_def * find_method(int type, char * name, int num_inputs, program * prog);
90 worker_def * find_method_noinputcheck(int type, char * name, program * prog);
91 worker_def * find_converter_method(int totype, int fromtype, program * prog);
92
93 //doesn't belong here, but because of include order issues I can't put it in datum.h
94 datum * new_datum_comp(company * comp, unsigned char union_type, int generic_len);
95
96 void vis_window_init(); //defined in window.cpp
97
98 int vis_random(datum ** inputlist, queue_entry * worker_entry);
99 int vis_print(datum ** inputlist, queue_entry * worker_entry);
100 int vis_build(datum ** inputlist, queue_entry * worker_entry);
101 int vis_end(datum ** inputlist, queue_entry * worker_entry);
102 int vis_append(datum ** inputlist, queue_entry * worker_entry);
103 int vis_getinput(datum ** inputlist, queue_entry * worker_entry);
104 int vis_stringtoint(datum ** inputlist, queue_entry * worker_entry);
105 int vis_string_get_dstring(datum ** inputlist, queue_entry * worker_entry);
106 int vis_whole_add(datum ** inputlist, queue_entry * worker_entry);
107 int vis_whole_fromhex(datum ** inputlist, queue_entry * worker_entry);
108 int vis_whole_subtract(datum ** inputlist, queue_entry * worker_entry);
109 int vis_whole_mult(datum ** inputlist, queue_entry * worker_entry);
110 int vis_whole_div(datum ** inputlist, queue_entry * worker_entry);
111 int vis_whole_or(datum ** inputlist, queue_entry * worker_entry);
112 int vis_whole_and(datum ** inputlist, queue_entry * worker_entry);
113 int vis_whole_lsh(datum ** inputlist, queue_entry * worker_entry);
114 int vis_whole_rsh(datum ** inputlist, queue_entry * worker_entry);
115 int vis_inttostring(datum ** inputlist, queue_entry * worker_entry);
116 int vis_stringequal(datum ** inputlist, queue_entry * worker_entry);
117 int vis_string_split(datum ** inputlist, queue_entry * worker_entry);
118 int vis_string_get_raw(datum ** inputlist, queue_entry * worker_entry);
119 int vis_string_put_raw(datum ** inputlist, queue_entry * worker_entry);
120 int vis_string_slice(datum ** inputlist, queue_entry * worker_entry);
121 int vis_string_reverse(datum ** inputlist, queue_entry * worker_entry);
122 int vis_string_length(datum ** inputlist, queue_entry * worker_entry);
123 int vis_string_put_byte(datum ** inputlist, queue_entry * worker_entry);
124 int vis_wholeequal(datum ** inputlist, queue_entry * worker_entry);
125 int vis_if(datum ** inputlist, queue_entry * worker_entry);
126 int vis_yesnotostring(datum ** inputlist, queue_entry * worker_entry);
127 int vis_greaterint(datum ** inputlist, queue_entry * worker_entry);
128 int vis_lesserint(datum ** inputlist, queue_entry * worker_entry);
129 int vis_greaterstring(datum ** inputlist, queue_entry * worker_entry);
130 int vis_lesserstring(datum ** inputlist, queue_entry * worker_entry);
131 int vis_stringtoreal(datum ** inputlist, queue_entry * worker_entry);
132 int vis_real_add(datum ** inputlist, queue_entry * worker_entry);
133 int vis_real_subtract(datum ** inputlist, queue_entry * worker_entry);
134 int vis_realequal(datum ** inputlist, queue_entry * worker_entry);
135 int vis_greaterreal(datum ** inputlist, queue_entry * worker_entry);
136 int vis_lesserreal(datum ** inputlist, queue_entry * worker_entry);
137 int vis_realtostring(datum ** inputlist, queue_entry * worker_entry);
138 //Index, Append, Swap, Insert, Remove, Set, Length, New
139 int vis_list_index(datum ** inputlist, queue_entry * worker_entry);
140 int vis_list_append(datum ** inputlist, queue_entry * worker_entry);
141 int vis_list_swap(datum ** inputlist, queue_entry * worker_entry);
142 int vis_list_insert(datum ** inputlist, queue_entry * worker_entry);
143 int vis_list_remove(datum ** inputlist, queue_entry * worker_entry);
144 int vis_list_set(datum ** inputlist, queue_entry * worker_entry);
145 int vis_list_length(datum ** inputlist, queue_entry * worker_entry);
146 int vis_list_new(datum ** inputlist, queue_entry * worker_entry);
147 int vis_list_first(datum ** inputlist, queue_entry * worker_entry);
148 int vis_list_next(datum ** inputlist, queue_entry * worker_entry);
149 int vis_dict_index(datum ** inputlist, queue_entry * worker_entry);
150 int vis_dict_swap(datum ** inputlist, queue_entry * worker_entry);
151 int vis_dict_remove(datum ** inputlist, queue_entry * worker_entry);
152 int vis_dict_set(datum ** inputlist, queue_entry * worker_entry);
153 int vis_dict_length(datum ** inputlist, queue_entry * worker_entry);
154 int vis_dict_new(datum ** inputlist, queue_entry * worker_entry);
155 int vis_dict_first(datum ** inputlist, queue_entry * worker_entry);
156 int vis_dict_next(datum ** inputlist, queue_entry * worker_entry);
157 int vis_file_from_string(datum ** inputlist, queue_entry * worker_entry);
158 int vis_file_get_fstring(datum ** inputlist, queue_entry * worker_entry);
159 int vis_file_get_dstring(datum ** inputlist, queue_entry * worker_entry);
160 int vis_file_get_byte(datum ** inputlist, queue_entry * worker_entry);
161 int vis_file_get_word(datum ** inputlist, queue_entry * worker_entry);
162 int vis_file_get_long(datum ** inputlist, queue_entry * worker_entry);
163 int vis_file_put_string(datum ** inputlist, queue_entry * worker_entry);
164 int vis_file_length(datum ** inputlist, queue_entry * worker_entry);
165 int vis_worker_from_string(datum ** inputlist, queue_entry * worker_entry);
166 int vis_worker_do(datum ** inputlist, queue_entry * worker_entry);
167 int vis_worker_setinput(datum ** inputlist, queue_entry * worker_entry);
168 int vis_window_new(datum ** inputlist, queue_entry * worker_entry);
169 int vis_window_add_widget(datum ** inputlist, queue_entry * worker_entry);
170 int vis_window_show(datum ** inputlist, queue_entry * worker_entry);
171 int vis_window_wait_close(datum ** inputlist, queue_entry * worker_entry);
172 int vis_window_get_value(datum ** inputlist, queue_entry * worker_entry);
173 int vis_window_set_value(datum ** inputlist, queue_entry * worker_entry);
174 int vis_window_shown_addwidget(datum ** inputlist, queue_entry * worker_entry);
175 int vis_worker_add_worker_call(datum ** inputlist, queue_entry * worker_entry);
176 int vis_worker_add_wire(datum ** inputlist, queue_entry * worker_entry);
177 int vis_worker_add_constant(datum ** inputlist, queue_entry * worker_entry);
178 int vis_worker_add_input(datum ** inputlist, queue_entry * worker_entry);
179 int vis_worker_add_output(datum ** inputlist, queue_entry * worker_entry);
180 int vis_worker_add_globalget(datum ** inputlist, queue_entry * worker_entry);
181 int vis_worker_add_globalset(datum ** inputlist, queue_entry * worker_entry);
182 int vis_worker_clear(datum ** inputlist, queue_entry * worker_entry);
183 int vis_worker_uses(datum ** inputlist, queue_entry * worker_entry);
184 int vis_worker_new(datum ** inputlist, queue_entry * worker_entry);
185 int vis_worker_setio_counts(datum ** inputlist, queue_entry * worker_entry);
186 int vis_program_run(datum ** inputlist, queue_entry * worker_entry);
187 int vis_program_add_builtins(datum ** inputlist, queue_entry * worker_entry);
188 int vis_program_new_worker(datum ** inputlist, queue_entry * worker_entry);
189 int vis_program_new(datum ** inputlist, queue_entry * worker_entry);
190 int vis_program_find_worker(datum ** inputlist, queue_entry * worker_entry);
191 int vis_program_add_worker(datum ** inputlist, queue_entry * worker_entry);
192 int vis_button_new(datum ** inputlist, queue_entry * worker_entry);
193 int vis_button_set_handler(datum ** inputlist, queue_entry * worker_entry);
194 int vis_inputbox_new(datum ** inputlist, queue_entry * worker_entry);
195 int vis_inputbox_settype(datum ** inputlist, queue_entry * worker_entry);
196 int net_client_new(datum ** params, queue_entry * worker_entry);
197 int net_client_put_string(datum ** params, queue_entry * worker_entry);
198 int net_client_get_fstring(datum ** params, queue_entry * worker_entry);
199 int net_client_get_dstring(datum ** params, queue_entry * worker_entry);
200 int net_client_put_raw(datum ** params, queue_entry * worker_entry);
201 int net_client_get_raw(datum ** params, queue_entry * worker_entry);
202 int vis_net_listenport(datum ** params, queue_entry * worker_entry);
203 int vis_wait_forever(datum ** params, queue_entry * worker_entry);
204 int vis_screen_custom_defaultpaint(datum ** params, queue_entry * entry);
205 int vis_screen_custom_drawline(datum ** params, queue_entry * entry);
206 int vis_screen_custom_drawstring(datum ** params, queue_entry * entry);
207 int vis_screen_custom_setdrawcolor(datum ** params, queue_entry * entry);
208 int vis_screen_custom_moveby(datum ** params, queue_entry * entry);
209 int vis_screen_custom_sethandler(datum ** params, queue_entry * entry);
210 int vis_screen_custom_removehandler(datum ** params, queue_entry * entry);
211 int vis_screen_custom_givefocus(datum ** params, queue_entry * entry);
212 int vis_screen_custom_addwidget(datum ** params, queue_entry * entry);
213 int vis_screen_custom_getwindow(datum ** params, queue_entry * entry);
214 int vis_customwidget_new(datum ** inputlist, queue_entry * worker_entry);
215 int vis_checkbox_new(datum ** params, queue_entry * entry);
216 int vis_dropdown_new(datum ** params, queue_entry * entry);
217 int vis_dropdown_settext(datum ** params, queue_entry * entry);
218 int vis_dropdown_select(datum ** params, queue_entry * entry);
219 int vis_buffer_new(datum ** params, queue_entry * entry);
220 int vis_buffer_lock(datum ** params, queue_entry * entry);
221 int vis_buffer_unlock(datum ** params, queue_entry * entry);
222 int vis_buffer_putbyte(datum ** params, queue_entry * entry);
223 int vis_buffer_writebyte(datum ** params, queue_entry * entry);
224 int vis_buffer_putshort(datum ** params, queue_entry * entry);
225 int vis_buffer_writeshort(datum ** params, queue_entry * entry);
226 int vis_buffer_putlong(datum ** params, queue_entry * entry);
227 int vis_buffer_writelong(datum ** params, queue_entry * entry);
228 int vis_buffer_reset(datum ** params, queue_entry * entry);
229 int vis_buffer_fromaddress(datum ** params, queue_entry * entry);
230 int init_global_store(datum ** params, queue_entry * worker_entry);
231 int vis_type_of(datum ** params, queue_entry * worker_entry);
232 int vis_real_div(datum ** inputlist, queue_entry * worker_entry);
233 int vis_clear_handler(datum ** params, queue_entry * entry);
234 int vis_register_handler(datum ** params, queue_entry * entry);
235 int vis_held_keys(datum ** params, queue_entry * worker_entry);
236 int vis_touch_position(datum ** params, queue_entry * worker_entry);
237 int vis_blueprint_new(datum ** params, queue_entry * entry);
238 int vis_blueprint_addfield(datum ** params, queue_entry * entry);
239 int vis_blueprint_name(datum ** params, queue_entry * entry);
240 int vis_blueprint_getfields(datum ** params, queue_entry * entry);
241 int vis_get_blueprint(datum ** params, queue_entry * entry);
242 int vis_get_field(datum ** params, queue_entry * entry);
243 int vis_set_field(datum ** params, queue_entry * entry);
244 int vis_program_newblueprint(datum ** params, queue_entry * entry);
245 int vis_worker_add_objectset(datum ** inputlist, queue_entry * worker_entry);
246 int vis_worker_add_objectget(datum ** inputlist, queue_entry * worker_entry);
247
248 datum * make_string(const char * string, int len, program * prog);
249 void close_sync_primitives();
250 void vis_window_closed(datum * window_datum);
251 void cleanup_check(queue_entry aworker);
252 void cleanup_custom_worker(worker_instance * instance, int worker_num);
253 void process_outputs(datum ** params, int aworker, worker_instance * instance);
254 void worker_complete(queue_entry aworker);
255 void test_virtual();
256 datum * create_dict(program * prog);
257 datum * create_list(program * prog);
258 int worker_populate_inputs(datum * inputWorker, datum * ioList, datum ** inputlist);
259 void run_queued_irqs();
260 void prep_program(program * prog);
261 void add_program_ref(program * prog);
262 void release_program_ref(program * prog);
263
264 extern int irq_queue_count;
265
266 #ifdef ENABLE_PROFILING
267 #define NUM_PROFS 33
268
269 extern __int64 vis_profile_start_times[NUM_PROFS];
270 extern __int64 vis_profile_running_total[NUM_PROFS];
271 extern int vis_profile_counts[NUM_PROFS];
272 unsigned __int64 __cdecl rdtsc(void);
273
274 #define VIS_PROFILE_START(index) vis_profile_start_times[index] = rdtsc()
275 #define VIS_PROFILE_END(index) vis_profile_running_total[index] += (rdtsc()-vis_profile_start_times[index]); ++vis_profile_counts[index]
276
277 #define PROF_ADDREF 29
278 #define PROF_RELEASE 30
279 #define PROF_NEW_DATUM 31
280 #define PROF_DATUM_ALLOC 32
281
282 #else
283 #define VIS_PROFILE_START(index)
284 #define VIS_PROFILE_END(index)
285 #endif
286
287
288 #ifdef CPLUSPLUS
289 }
290 #endif
291
292
293 #endif //_INTERP_H_
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309