Mercurial > repos > rhope
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/interp.h Tue Apr 28 23:06:07 2009 +0000 @@ -0,0 +1,309 @@ +#ifndef _INTERP_H_ +#define _INTERP_H_ + +#ifdef WIN32 + #include <windows.h> +#endif + +#ifndef BOOL + #define BOOL short + #define TRUE 1 + #define FALSE 0 +#endif + +#ifndef DWORD + #define DWORD unsigned long +#endif + +#ifndef WINAPI + #define WINAPI +#endif + +#ifndef LPVOID + #define LPVOID void * +#endif +#ifndef NULL + #define NULL 0 +#endif +#include "vis_threading.h" +#include "structs.h" +#include "debugmacros.h" + +#define CONSTANT 0 +#define ROOM 1 +#define WORKER 2 +#define INPUT 3 +#define OUTPUT 4 +#define SET_COMP 5 +#define GET_COMP 6 +#define SET_GLOBAL 7 +#define GET_GLOBAL 8 +#define TAIL_CALL 9 +#define TAIL_RECURSE 10 + +#define RECTANGLE 1 +#define TRAPEZOID 2 + + +#define WORKER_TYPE 0 +#define MAGIC_TYPE 1 +#define USER_FLAG 0x8000 +#define TYPE_MASK 0xFF + +#define START_COMP_STORAGE 40 +#define START_DEF_STORAGE 100 + +#ifdef CPLUSPLUS +extern "C" { +#endif + +//extern company companylist[]; +//extern int num_companies; +extern BOOL execute_active; +extern int program_count; +VIS_EXTERN_CRITICAL_SECTION(program_count_lock) + +void main_callback(worker_instance * junkinst, int junk, worker_instance * main_instance, void * data); + +void optimize(worker_def * def); +void run_optimized(worker_instance * instance, datum ** params); +datum * get_constant(char * value, int len, program * prog); +int execute_def(worker_def * process_def, queue_entry worker_entry, datum ** params, instance_callback callback); +int execute_def_data(worker_def * process_def, queue_entry worker_entry, datum ** params, instance_callback callback, void * data); +BOOL execute_def_wait(worker_def * def, datum ** params); +int process_worker(queue_entry aworker); +void initworkers(program * prog); +void initpredefworkers(program * prog); +DWORD WINAPI worker_thread(LPVOID param); +void interp_start(int num_threads, BOOL use_this_thread, int argc, char ** argv, program * initial_prog); +void interp_stop(); +void add_if_ready(int workerNum, worker_instance * instance); +void make_lookup_arrays(program * prog); +void def_make_lookup(worker_def * def); +queue_entry get_queue(); +void add_queue(int data, worker_instance * instance); +void add_multiple(int * data, int num, worker_instance * instance); +void init_sync_primitives(); +void init_global_storage(); +void pack_list_sub_callback(worker_instance * caller_instance, int caller_workernum, worker_instance * done_instance, void * data); +worker_def * find_method(int type, char * name, int num_inputs, program * prog); +worker_def * find_method_noinputcheck(int type, char * name, program * prog); +worker_def * find_converter_method(int totype, int fromtype, program * prog); + +//doesn't belong here, but because of include order issues I can't put it in datum.h +datum * new_datum_comp(company * comp, unsigned char union_type, int generic_len); + +void vis_window_init(); //defined in window.cpp + +int vis_random(datum ** inputlist, queue_entry * worker_entry); +int vis_print(datum ** inputlist, queue_entry * worker_entry); +int vis_build(datum ** inputlist, queue_entry * worker_entry); +int vis_end(datum ** inputlist, queue_entry * worker_entry); +int vis_append(datum ** inputlist, queue_entry * worker_entry); +int vis_getinput(datum ** inputlist, queue_entry * worker_entry); +int vis_stringtoint(datum ** inputlist, queue_entry * worker_entry); +int vis_string_get_dstring(datum ** inputlist, queue_entry * worker_entry); +int vis_whole_add(datum ** inputlist, queue_entry * worker_entry); +int vis_whole_fromhex(datum ** inputlist, queue_entry * worker_entry); +int vis_whole_subtract(datum ** inputlist, queue_entry * worker_entry); +int vis_whole_mult(datum ** inputlist, queue_entry * worker_entry); +int vis_whole_div(datum ** inputlist, queue_entry * worker_entry); +int vis_whole_or(datum ** inputlist, queue_entry * worker_entry); +int vis_whole_and(datum ** inputlist, queue_entry * worker_entry); +int vis_whole_lsh(datum ** inputlist, queue_entry * worker_entry); +int vis_whole_rsh(datum ** inputlist, queue_entry * worker_entry); +int vis_inttostring(datum ** inputlist, queue_entry * worker_entry); +int vis_stringequal(datum ** inputlist, queue_entry * worker_entry); +int vis_string_split(datum ** inputlist, queue_entry * worker_entry); +int vis_string_get_raw(datum ** inputlist, queue_entry * worker_entry); +int vis_string_put_raw(datum ** inputlist, queue_entry * worker_entry); +int vis_string_slice(datum ** inputlist, queue_entry * worker_entry); +int vis_string_reverse(datum ** inputlist, queue_entry * worker_entry); +int vis_string_length(datum ** inputlist, queue_entry * worker_entry); +int vis_string_put_byte(datum ** inputlist, queue_entry * worker_entry); +int vis_wholeequal(datum ** inputlist, queue_entry * worker_entry); +int vis_if(datum ** inputlist, queue_entry * worker_entry); +int vis_yesnotostring(datum ** inputlist, queue_entry * worker_entry); +int vis_greaterint(datum ** inputlist, queue_entry * worker_entry); +int vis_lesserint(datum ** inputlist, queue_entry * worker_entry); +int vis_greaterstring(datum ** inputlist, queue_entry * worker_entry); +int vis_lesserstring(datum ** inputlist, queue_entry * worker_entry); +int vis_stringtoreal(datum ** inputlist, queue_entry * worker_entry); +int vis_real_add(datum ** inputlist, queue_entry * worker_entry); +int vis_real_subtract(datum ** inputlist, queue_entry * worker_entry); +int vis_realequal(datum ** inputlist, queue_entry * worker_entry); +int vis_greaterreal(datum ** inputlist, queue_entry * worker_entry); +int vis_lesserreal(datum ** inputlist, queue_entry * worker_entry); +int vis_realtostring(datum ** inputlist, queue_entry * worker_entry); +//Index, Append, Swap, Insert, Remove, Set, Length, New +int vis_list_index(datum ** inputlist, queue_entry * worker_entry); +int vis_list_append(datum ** inputlist, queue_entry * worker_entry); +int vis_list_swap(datum ** inputlist, queue_entry * worker_entry); +int vis_list_insert(datum ** inputlist, queue_entry * worker_entry); +int vis_list_remove(datum ** inputlist, queue_entry * worker_entry); +int vis_list_set(datum ** inputlist, queue_entry * worker_entry); +int vis_list_length(datum ** inputlist, queue_entry * worker_entry); +int vis_list_new(datum ** inputlist, queue_entry * worker_entry); +int vis_list_first(datum ** inputlist, queue_entry * worker_entry); +int vis_list_next(datum ** inputlist, queue_entry * worker_entry); +int vis_dict_index(datum ** inputlist, queue_entry * worker_entry); +int vis_dict_swap(datum ** inputlist, queue_entry * worker_entry); +int vis_dict_remove(datum ** inputlist, queue_entry * worker_entry); +int vis_dict_set(datum ** inputlist, queue_entry * worker_entry); +int vis_dict_length(datum ** inputlist, queue_entry * worker_entry); +int vis_dict_new(datum ** inputlist, queue_entry * worker_entry); +int vis_dict_first(datum ** inputlist, queue_entry * worker_entry); +int vis_dict_next(datum ** inputlist, queue_entry * worker_entry); +int vis_file_from_string(datum ** inputlist, queue_entry * worker_entry); +int vis_file_get_fstring(datum ** inputlist, queue_entry * worker_entry); +int vis_file_get_dstring(datum ** inputlist, queue_entry * worker_entry); +int vis_file_get_byte(datum ** inputlist, queue_entry * worker_entry); +int vis_file_get_word(datum ** inputlist, queue_entry * worker_entry); +int vis_file_get_long(datum ** inputlist, queue_entry * worker_entry); +int vis_file_put_string(datum ** inputlist, queue_entry * worker_entry); +int vis_file_length(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_from_string(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_do(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_setinput(datum ** inputlist, queue_entry * worker_entry); +int vis_window_new(datum ** inputlist, queue_entry * worker_entry); +int vis_window_add_widget(datum ** inputlist, queue_entry * worker_entry); +int vis_window_show(datum ** inputlist, queue_entry * worker_entry); +int vis_window_wait_close(datum ** inputlist, queue_entry * worker_entry); +int vis_window_get_value(datum ** inputlist, queue_entry * worker_entry); +int vis_window_set_value(datum ** inputlist, queue_entry * worker_entry); +int vis_window_shown_addwidget(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_add_worker_call(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_add_wire(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_add_constant(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_add_input(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_add_output(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_add_globalget(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_add_globalset(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_clear(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_uses(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_new(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_setio_counts(datum ** inputlist, queue_entry * worker_entry); +int vis_program_run(datum ** inputlist, queue_entry * worker_entry); +int vis_program_add_builtins(datum ** inputlist, queue_entry * worker_entry); +int vis_program_new_worker(datum ** inputlist, queue_entry * worker_entry); +int vis_program_new(datum ** inputlist, queue_entry * worker_entry); +int vis_program_find_worker(datum ** inputlist, queue_entry * worker_entry); +int vis_program_add_worker(datum ** inputlist, queue_entry * worker_entry); +int vis_button_new(datum ** inputlist, queue_entry * worker_entry); +int vis_button_set_handler(datum ** inputlist, queue_entry * worker_entry); +int vis_inputbox_new(datum ** inputlist, queue_entry * worker_entry); +int vis_inputbox_settype(datum ** inputlist, queue_entry * worker_entry); +int net_client_new(datum ** params, queue_entry * worker_entry); +int net_client_put_string(datum ** params, queue_entry * worker_entry); +int net_client_get_fstring(datum ** params, queue_entry * worker_entry); +int net_client_get_dstring(datum ** params, queue_entry * worker_entry); +int net_client_put_raw(datum ** params, queue_entry * worker_entry); +int net_client_get_raw(datum ** params, queue_entry * worker_entry); +int vis_net_listenport(datum ** params, queue_entry * worker_entry); +int vis_wait_forever(datum ** params, queue_entry * worker_entry); +int vis_screen_custom_defaultpaint(datum ** params, queue_entry * entry); +int vis_screen_custom_drawline(datum ** params, queue_entry * entry); +int vis_screen_custom_drawstring(datum ** params, queue_entry * entry); +int vis_screen_custom_setdrawcolor(datum ** params, queue_entry * entry); +int vis_screen_custom_moveby(datum ** params, queue_entry * entry); +int vis_screen_custom_sethandler(datum ** params, queue_entry * entry); +int vis_screen_custom_removehandler(datum ** params, queue_entry * entry); +int vis_screen_custom_givefocus(datum ** params, queue_entry * entry); +int vis_screen_custom_addwidget(datum ** params, queue_entry * entry); +int vis_screen_custom_getwindow(datum ** params, queue_entry * entry); +int vis_customwidget_new(datum ** inputlist, queue_entry * worker_entry); +int vis_checkbox_new(datum ** params, queue_entry * entry); +int vis_dropdown_new(datum ** params, queue_entry * entry); +int vis_dropdown_settext(datum ** params, queue_entry * entry); +int vis_dropdown_select(datum ** params, queue_entry * entry); +int vis_buffer_new(datum ** params, queue_entry * entry); +int vis_buffer_lock(datum ** params, queue_entry * entry); +int vis_buffer_unlock(datum ** params, queue_entry * entry); +int vis_buffer_putbyte(datum ** params, queue_entry * entry); +int vis_buffer_writebyte(datum ** params, queue_entry * entry); +int vis_buffer_putshort(datum ** params, queue_entry * entry); +int vis_buffer_writeshort(datum ** params, queue_entry * entry); +int vis_buffer_putlong(datum ** params, queue_entry * entry); +int vis_buffer_writelong(datum ** params, queue_entry * entry); +int vis_buffer_reset(datum ** params, queue_entry * entry); +int vis_buffer_fromaddress(datum ** params, queue_entry * entry); +int init_global_store(datum ** params, queue_entry * worker_entry); +int vis_type_of(datum ** params, queue_entry * worker_entry); +int vis_real_div(datum ** inputlist, queue_entry * worker_entry); +int vis_clear_handler(datum ** params, queue_entry * entry); +int vis_register_handler(datum ** params, queue_entry * entry); +int vis_held_keys(datum ** params, queue_entry * worker_entry); +int vis_touch_position(datum ** params, queue_entry * worker_entry); +int vis_blueprint_new(datum ** params, queue_entry * entry); +int vis_blueprint_addfield(datum ** params, queue_entry * entry); +int vis_blueprint_name(datum ** params, queue_entry * entry); +int vis_blueprint_getfields(datum ** params, queue_entry * entry); +int vis_get_blueprint(datum ** params, queue_entry * entry); +int vis_get_field(datum ** params, queue_entry * entry); +int vis_set_field(datum ** params, queue_entry * entry); +int vis_program_newblueprint(datum ** params, queue_entry * entry); +int vis_worker_add_objectset(datum ** inputlist, queue_entry * worker_entry); +int vis_worker_add_objectget(datum ** inputlist, queue_entry * worker_entry); + +datum * make_string(const char * string, int len, program * prog); +void close_sync_primitives(); +void vis_window_closed(datum * window_datum); +void cleanup_check(queue_entry aworker); +void cleanup_custom_worker(worker_instance * instance, int worker_num); +void process_outputs(datum ** params, int aworker, worker_instance * instance); +void worker_complete(queue_entry aworker); +void test_virtual(); +datum * create_dict(program * prog); +datum * create_list(program * prog); +int worker_populate_inputs(datum * inputWorker, datum * ioList, datum ** inputlist); +void run_queued_irqs(); +void prep_program(program * prog); +void add_program_ref(program * prog); +void release_program_ref(program * prog); + +extern int irq_queue_count; + +#ifdef ENABLE_PROFILING +#define NUM_PROFS 33 + +extern __int64 vis_profile_start_times[NUM_PROFS]; +extern __int64 vis_profile_running_total[NUM_PROFS]; +extern int vis_profile_counts[NUM_PROFS]; +unsigned __int64 __cdecl rdtsc(void); + +#define VIS_PROFILE_START(index) vis_profile_start_times[index] = rdtsc() +#define VIS_PROFILE_END(index) vis_profile_running_total[index] += (rdtsc()-vis_profile_start_times[index]); ++vis_profile_counts[index] + +#define PROF_ADDREF 29 +#define PROF_RELEASE 30 +#define PROF_NEW_DATUM 31 +#define PROF_DATUM_ALLOC 32 + +#else +#define VIS_PROFILE_START(index) +#define VIS_PROFILE_END(index) +#endif + + +#ifdef CPLUSPLUS +} +#endif + + +#endif //_INTERP_H_ + + + + + + + + + + + + + + + +