00001 #ifndef UCTOOLS_H
00002 #define UCTOOLS_H
00003
00004
00005
00006 #define IMMED 0
00007
00008 #define DATA_STRING 1
00009
00010 #define RELATIVE_JUMP 2
00011
00012 #define CALL 3
00013
00014 #define VARREF 4
00015
00016 #define FLGREF 5
00017
00018 #define EXTCALL 6
00019
00020 #define IMMED_AND_RELATIVE_JUMP 7
00021
00022 #define PUSH 8
00023
00024 #define BYTE 9
00025
00026 #define SLOOP 10
00027 #define POP 11
00028 #define IMMED32 12
00029 #define DATA_STRING32 13
00030 #define RELATIVE_JUMP32 14
00031 #define IMMED_RELJUMP32 15
00032 #define SLOOP32 16
00033
00034
00035 typedef struct _opcode_desc
00036 {
00037
00038 const char* mnemonic;
00039
00040 int nbytes;
00041
00042 unsigned int type;
00043 } opcode_desc;
00044
00045
00046 static opcode_desc opcode_table[] =
00047 {
00048 { NULL, 0, 0 },
00049 { NULL, 0, 0 },
00050 { "loop", 10, SLOOP },
00051 { NULL, 0, 0 },
00052 { "startconv", 2, RELATIVE_JUMP },
00053 { "jne", 2, RELATIVE_JUMP },
00054 { "jmp", 2, RELATIVE_JUMP },
00055 { "cmps", 4, IMMED_AND_RELATIVE_JUMP },
00056 { NULL, 0, 0 },
00057 { "add", 0, 0 },
00058 { "sub", 0, 0 },
00059 { "div", 0, 0 },
00060 { "mul", 0, 0 },
00061 { "mod", 0, 0 },
00062 { "and", 0, 0 },
00063 { "or", 0, 0 },
00064 { "not", 0, 0 },
00065 { NULL, 0, 0 },
00066 { "pop", 2, VARREF },
00067 { "push\ttrue", 0, 0 },
00068 { "push\tfalse", 0, 0 },
00069 { NULL, 0, 0 },
00070 { "cmpgt", 0, 0 },
00071 { "cmpl", 0, 0 },
00072 { "cmpge", 0, 0 },
00073 { "cmple", 0, 0 },
00074 { "cmpne", 0, 0 },
00075 { NULL, 0, 0 },
00076 { "addsi", 2, DATA_STRING },
00077 { "pushs", 2, DATA_STRING },
00078 { "arrc", 2, IMMED },
00079 { "pushi", 2, IMMED },
00080 { NULL, 0, 0 },
00081 { "push", 2, VARREF },
00082 { "cmpeq", 0, 0 },
00083 { NULL, 0, 0 },
00084 { "call", 2, EXTCALL },
00085 { "ret", 0, 0 },
00086 { "aidx", 2, VARREF },
00087 { NULL, 0, 0 },
00088 { NULL, 0, 0 },
00089 { NULL, 0, 0 },
00090 { NULL, 0, 0 },
00091 { NULL, 0, 0 },
00092 { "ret2", 0, 0 },
00093 { "setr", 0, 0 },
00094 { "initloop", 0, 0 },
00095 { "addsv", 2, VARREF },
00096 { "in", 0, 0 },
00097 { "conv_something", 4, IMMED_AND_RELATIVE_JUMP },
00098 { "rts", 0, 0 },
00099 { "say", 0, 0 },
00100 { NULL, 0, 0 },
00101 { NULL, 0, 0 },
00102 { NULL, 0, 0 },
00103 { NULL, 0, 0 },
00104 { "callis", 3, CALL },
00105 { "calli", 3, CALL },
00106 { NULL, 0, 0 },
00107 { NULL, 0, 0 },
00108 { NULL, 0, 0 },
00109 { NULL, 0, 0 },
00110 { "push\titemref", 0, 0 },
00111 { "abrt", 0, 0 },
00112 { "endconv", 0, 0 },
00113 { NULL, 0, 0 },
00114 { "pushf", 2, FLGREF },
00115 { "popf", 2, FLGREF },
00116 { "pushw", 1, BYTE },
00117 { NULL, 0, 0 },
00118 { "setarrayelem", 2, IMMED },
00119 { "calle",2,IMMED },
00120 { "push\teventid", 0, 0 },
00121 { NULL, 0, 0 },
00122 { "arra", 0, 0 },
00123 { "pop\teventid", 0, 0 },
00124 { "line",2,IMMED },
00125 { "func",4,DATA_STRING },
00126 { NULL, 0, 0 }, { NULL, 0, 0 },
00127 { "push\tstatic", 2, VARREF },
00128 { "pop\tstatic", 2, VARREF },
00129 { "callo",2,IMMED },
00130 { NULL, 0, 0 },
00131 { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 },
00132 { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 },
00133 { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 },
00134 { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 },
00135 { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 },
00136 { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 },
00137 { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 },
00138 { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 },
00139 { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 },
00140 { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 },
00141 { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 }, { NULL, 0, 0 },
00142 { NULL, 0, 0 },
00143 { NULL, 0, 0 },
00144 { "sloop_iter32", 12, SLOOP32 },
00145 { NULL, 0, 0 },
00146 { "startconv32", 4, RELATIVE_JUMP32 },
00147 { "jne32", 4, RELATIVE_JUMP32 },
00148 { "jmp32", 4, RELATIVE_JUMP32 },
00149 { "cmps32", 6, IMMED_RELJUMP32 },
00150 { NULL, 0, 0 },
00151 { NULL, 0, 0 },
00152 { NULL, 0, 0 },
00153 { NULL, 0, 0 },
00154 { NULL, 0, 0 },
00155 { NULL, 0, 0 },
00156 { NULL, 0, 0 },
00157 { NULL, 0, 0 },
00158 { NULL, 0, 0 },
00159 { NULL, 0, 0 },
00160 { NULL, 0, 0 },
00161 { NULL, 0, 0 },
00162 { NULL, 0, 0 },
00163 { NULL, 0, 0 },
00164 { NULL, 0, 0 },
00165 { NULL, 0, 0 },
00166 { NULL, 0, 0 },
00167 { NULL, 0, 0 },
00168 { NULL, 0, 0 },
00169 { NULL, 0, 0 },
00170 { "addsi32", 4, DATA_STRING32 },
00171 { "pushs32", 4, DATA_STRING32 },
00172 { NULL, 0, 0 },
00173 { "pushi32", 4, IMMED32 },
00174 { NULL, 0, 0 },
00175 { NULL, 0, 0 },
00176 { NULL, 0, 0 },
00177 { NULL, 0, 0 },
00178 { NULL, 0, 0 },
00179 { NULL, 0, 0 },
00180 { NULL, 0, 0 },
00181 { NULL, 0, 0 },
00182 { NULL, 0, 0 },
00183 { NULL, 0, 0 },
00184 { NULL, 0, 0 },
00185 { NULL, 0, 0 },
00186 { NULL, 0, 0 },
00187 { NULL, 0, 0 },
00188 { "sloop32", 13, SLOOP32 },
00189 { NULL, 0, 0 },
00190 { NULL, 0, 0 },
00191 { "conv_something32", 6, IMMED_RELJUMP32 },
00192 { NULL, 0, 0 },
00193 { NULL, 0, 0 },
00194 { NULL, 0, 0 },
00195 { NULL, 0, 0 },
00196 { NULL, 0, 0 },
00197 { NULL, 0, 0 },
00198 { NULL, 0, 0 },
00199 { NULL, 0, 0 },
00200 { NULL, 0, 0 },
00201 { NULL, 0, 0 },
00202 { NULL, 0, 0 },
00203 { NULL, 0, 0 },
00204 { NULL, 0, 0 },
00205 { NULL, 0, 0 },
00206 { NULL, 0, 0 },
00207 { NULL, 0, 0 },
00208 { NULL, 0, 0 },
00209 { NULL, 0, 0 },
00210 { NULL, 0, 0 },
00211 { NULL, 0, 0 },
00212 { NULL, 0, 0 },
00213 { NULL, 0, 0 },
00214 { NULL, 0, 0 },
00215 { NULL, 0, 0 },
00216 { NULL, 0, 0 },
00217 { NULL, 0, 0 },
00218 { NULL, 0, 0 },
00219 { "func32",8,DATA_STRING32 }
00220
00221 };
00222
00223
00224
00225
00226
00227
00228
00229
00230 #define USECODE_INTRINSIC_PTR(NAME) #NAME
00231
00232 const char *bg_intrinsic_table[] =
00233 {
00234 #include "bgintrinsics.h"
00235 };
00236 const int bg_intrinsic_size = sizeof(bg_intrinsic_table)/sizeof(char*);
00237 const char *si_intrinsic_table[] =
00238 {
00239 #include "siintrinsics.h"
00240 };
00241 const int si_intrinsic_size = sizeof(si_intrinsic_table)/sizeof(char*);
00242
00243
00244
00245 #if 0
00246 const char* func_table[] =
00247 {
00248 "get_random",
00249 "execute_usecode_array",
00250 "delayed_execute_usecode_array",
00251 "show_npc_face",
00252 "hide_npc_face",
00253 "add_answer",
00254 "remove_answer",
00255 "push_answers",
00256 "pop_answers",
00257 "clear_answers",
00258 "select_from_menu",
00259 "select_from_menu2",
00260 "input_numeric_value",
00261 "set_item_shape",
00262 "find_nearest",
00263 "play_sound_effect",
00264 "die_roll",
00265 "get_item_shape",
00266 "get_item_frame",
00267 "set_item_frame",
00268 "get_item_quality",
00269 "set_item_quality",
00270 "get_item_quantity",
00271 "set_item_quantity",
00272 "get_object_position",
00273 "get_distance",
00274 "find_direction",
00275 "get_npc_object",
00276 "get_schedule_type",
00277 "set_schedule_type",
00278 "add_to_party",
00279 "remove_from_party",
00280 "get_npc_property",
00281 "set_npc_property",
00282 "get_avatar_ref",
00283 "get_party_list",
00284 "create_new_object",
00285 "set_last_created",
00286 "update_last_created",
00287 "get_npc_name",
00288 "count_objects",
00289 "take_from_owner",
00290 "get_container_items",
00291 "remove_party_items",
00292 "add_party_items",
00293 NULL,
00294 "play_music",
00295 "npc_nearby",
00296 "find_nearby_avatar",
00297 "is_npc",
00298 "display_runes",
00299 "click_on_item",
00300 NULL,
00301 "find_nearby",
00302 "give_last_created",
00303 "is_dead",
00304 "game_hour",
00305 "game_minute",
00306 "get_npc_number",
00307 "part_of_day",
00308 "get_alignment",
00309 "set_alignment",
00310 "move_object",
00311 NULL,
00312 "item_say",
00313 "projectile_effect",
00314 "get_lift",
00315 "set_lift",
00316 NULL,
00317 NULL,
00318 "sit_down",
00319 NULL,
00320 "display_map",
00321 "kill_npc",
00322 NULL,
00323 "set_npc_attack_mode",
00324 "set_target_npc_to_attack",
00325 "clone_npc",
00326 NULL,
00327 "show_crystal_ball",
00328 "show_wizard_eye",
00329 "resurrect_npc",
00330 "add_spell",
00331 "sprite_effect",
00332 NULL,
00333 "book_mode",
00334 "stop_time",
00335 "cause_light",
00336 "get_barge",
00337 "earthquake",
00338 "is_player_female",
00339 "armageddon",
00340 "halt_scheduled",
00341 "cause_blackout",
00342 "get_array_size",
00343 "mark_stone",
00344 "recall_stone",
00345 NULL,
00346 "is_pc_inside",
00347 "set_orrery_state",
00348 NULL,
00349 "get_timer",
00350 "set_timer",
00351 NULL,
00352 "mouse_exists",
00353 NULL,
00354 "flash_mouse",
00355 NULL,
00356 NULL,
00357 NULL,
00358 "get_container",
00359 "remove_item",
00360 NULL,
00361 NULL,
00362 "get_equipment_list",
00363 NULL,
00364 NULL,
00365 "start_endgame",
00366 "fire_cannon",
00367 "nap_time",
00368 "advance_time",
00369 "in_usecode",
00370 NULL,
00371 NULL,
00372 NULL,
00373 "path_run_usecode",
00374 "close_gumps",
00375 "item_say",
00376 NULL,
00377 "in_gump_mode",
00378 NULL,
00379 NULL,
00380 NULL,
00381 "is_not_blocked",
00382 NULL,
00383 "direction_from",
00384 "get_npc_flag",
00385 "set_npc_flag",
00386 "clear_npc_flag",
00387 "run_usecode",
00388 "fade_palette",
00389 "get_party_list2",
00390 "in_combat",
00391 NULL,
00392 NULL,
00393 NULL,
00394 NULL,
00395 NULL,
00396 NULL,
00397 NULL,
00398 NULL
00399 };
00400 #endif
00401
00402 #endif