diff --git a/.vs/launch.vs.json b/.vs/launch.vs.json index af32f0bed6..deec64e337 100644 --- a/.vs/launch.vs.json +++ b/.vs/launch.vs.json @@ -9,11 +9,7 @@ "name": "Run Tests - Summary", "args": [ "--gtest_brief=1" - ], - "env": { - "NEXT_DIR": "${projectDir}", - "FAKE_ISO_PATH": "/game/fake_iso.txt" - } + ] }, { "type": "default", @@ -22,17 +18,28 @@ "name": "Run Tests - Verbose", "args": [ "--gtest_brief=0" - ], - "env": { - "NEXT_DIR": "${projectDir}", - "FAKE_ISO_PATH": "/game/fake_iso.txt" - } + ] }, { "type": "default", "project": "CMakeLists.txt", "projectTarget": "gk.exe (bin\\gk.exe)", - "name": "Run Game" + "name": "Run Runtime (no kernel)", + "args": [ + "-fakeiso", + "-debug", + "-nokernel" + ] + }, + { + "type": "default", + "project": "CMakeLists.txt", + "projectTarget": "gk.exe (bin\\gk.exe)", + "name": "Run Runtime (with kernel)", + "args": [ + "-fakeiso", + "-debug" + ] }, { "type": "default", diff --git a/boot_kernel.sh b/boot_kernel.sh new file mode 100755 index 0000000000..7cd250cb20 --- /dev/null +++ b/boot_kernel.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# Directory of this script +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + +$DIR/build/game/gk -fakeiso -debug diff --git a/common/goos/CMakeLists.txt b/common/goos/CMakeLists.txt index 170c8df0d8..4347c0d3a1 100644 --- a/common/goos/CMakeLists.txt +++ b/common/goos/CMakeLists.txt @@ -1,2 +1,2 @@ add_library(goos SHARED Object.cpp TextDB.cpp Reader.cpp Interpreter.cpp InterpreterEval.cpp) -target_link_libraries(goos common_util) \ No newline at end of file +target_link_libraries(goos common_util fmt) \ No newline at end of file diff --git a/common/goos/Interpreter.cpp b/common/goos/Interpreter.cpp index 3c3eb8569e..8833619530 100644 --- a/common/goos/Interpreter.cpp +++ b/common/goos/Interpreter.cpp @@ -38,36 +38,36 @@ Interpreter::Interpreter() { {"while", &Interpreter::eval_while}, }; - builtin_forms = { - {"top-level", &Interpreter::eval_begin}, - {"begin", &Interpreter::eval_begin}, - {"exit", &Interpreter::eval_exit}, - {"read", &Interpreter::eval_read}, - {"read-file", &Interpreter::eval_read_file}, - {"print", &Interpreter::eval_print}, - {"inspect", &Interpreter::eval_inspect}, - {"load-file", &Interpreter::eval_load_file}, - {"eq?", &Interpreter::eval_equals}, - {"gensym", &Interpreter::eval_gensym}, - {"eval", &Interpreter::eval_eval}, - {"cons", &Interpreter::eval_cons}, - {"car", &Interpreter::eval_car}, - {"cdr", &Interpreter::eval_cdr}, - {"set-car!", &Interpreter::eval_set_car}, - {"set-cdr!", &Interpreter::eval_set_cdr}, - {"+", &Interpreter::eval_plus}, - {"-", &Interpreter::eval_minus}, - {"*", &Interpreter::eval_times}, - {"/", &Interpreter::eval_divide}, - {"=", &Interpreter::eval_numequals}, - {"<", &Interpreter::eval_lt}, - {">", &Interpreter::eval_gt}, - {"<=", &Interpreter::eval_leq}, - {">=", &Interpreter::eval_geq}, - {"null?", &Interpreter::eval_null}, - {"type?", &Interpreter::eval_type}, - {"current-method-type", &Interpreter::eval_current_method_type}, - }; + builtin_forms = {{"top-level", &Interpreter::eval_begin}, + {"begin", &Interpreter::eval_begin}, + {"exit", &Interpreter::eval_exit}, + {"read", &Interpreter::eval_read}, + {"read-file", &Interpreter::eval_read_file}, + {"print", &Interpreter::eval_print}, + {"inspect", &Interpreter::eval_inspect}, + {"load-file", &Interpreter::eval_load_file}, + {"eq?", &Interpreter::eval_equals}, + {"gensym", &Interpreter::eval_gensym}, + {"eval", &Interpreter::eval_eval}, + {"cons", &Interpreter::eval_cons}, + {"car", &Interpreter::eval_car}, + {"cdr", &Interpreter::eval_cdr}, + {"set-car!", &Interpreter::eval_set_car}, + {"set-cdr!", &Interpreter::eval_set_cdr}, + {"+", &Interpreter::eval_plus}, + {"-", &Interpreter::eval_minus}, + {"*", &Interpreter::eval_times}, + {"/", &Interpreter::eval_divide}, + {"=", &Interpreter::eval_numequals}, + {"<", &Interpreter::eval_lt}, + {">", &Interpreter::eval_gt}, + {"<=", &Interpreter::eval_leq}, + {">=", &Interpreter::eval_geq}, + {"null?", &Interpreter::eval_null}, + {"type?", &Interpreter::eval_type}, + {"current-method-type", &Interpreter::eval_current_method_type}, + {"fmt", &Interpreter::eval_format}, + {"error", &Interpreter::eval_error}}; string_to_type = {{"empty-list", ObjectType::EMPTY_LIST}, {"integer", ObjectType::INTEGER}, diff --git a/common/goos/Interpreter.h b/common/goos/Interpreter.h index 6a643ce584..52eed89c23 100644 --- a/common/goos/Interpreter.h +++ b/common/goos/Interpreter.h @@ -180,6 +180,12 @@ class Interpreter { Object eval_current_method_type(const Object& form, Arguments& args, const std::shared_ptr& env); + Object eval_format(const Object& form, + Arguments& args, + const std::shared_ptr& env); + Object eval_error(const Object& form, + Arguments& args, + const std::shared_ptr& env); // specials Object eval_define(const Object& form, diff --git a/common/goos/InterpreterEval.cpp b/common/goos/InterpreterEval.cpp index bd3e8eac47..226bda29a5 100644 --- a/common/goos/InterpreterEval.cpp +++ b/common/goos/InterpreterEval.cpp @@ -3,6 +3,7 @@ * Implementation of built-in GOOS functions. */ +#include #include "Interpreter.h" namespace goos { @@ -586,4 +587,54 @@ Object Interpreter::eval_current_method_type(const Object& form, vararg_check(form, args, {}, {}); return SymbolObject::make_new(reader.symbolTable, goal_to_goos.enclosing_method_type); } + +Object Interpreter::eval_format(const Object& form, + Arguments& args, + const std::shared_ptr& env) { + (void)env; + if (args.unnamed.size() < 2) { + throw_eval_error(form, "format must get at least two arguments"); + } + + auto dest = args.unnamed.at(0); + auto format_str = args.unnamed.at(1); + if (!format_str.is_string()) { + throw_eval_error(form, "format string must be a string"); + } + + // Note: this might be relying on internal implementation details of libfmt to work properly + // and isn't a great solution. + std::vector> args2; + std::vector strings; + for (size_t i = 2; i < args.unnamed.size(); i++) { + if (args.unnamed.at(i).is_string()) { + strings.push_back(args.unnamed.at(i).as_string()->data); + } else { + strings.push_back(args.unnamed.at(i).print()); + } + } + + for (auto& x : strings) { + args2.push_back(fmt::detail::make_arg(x)); + } + + auto formatted = + fmt::vformat(format_str.as_string()->data, + fmt::format_args(args2.data(), static_cast(args2.size()))); + + if (truthy(dest)) { + printf("%s", formatted.c_str()); + } + + return StringObject::make_new(formatted); +} + +Object Interpreter::eval_error(const Object& form, + Arguments& args, + const std::shared_ptr& env) { + (void)env; + vararg_check(form, args, {ObjectType::STRING}, {}); + throw_eval_error(form, "Error: " + args.unnamed.at(0).as_string()->data); + return EmptyListObject::make_new(); +} } // namespace goos \ No newline at end of file diff --git a/common/type_system/TypeSystem.cpp b/common/type_system/TypeSystem.cpp index 94b1b42530..0d1f4a93a1 100644 --- a/common/type_system/TypeSystem.cpp +++ b/common/type_system/TypeSystem.cpp @@ -9,6 +9,7 @@ TypeSystem::TypeSystem() { // the "none" and "_type_" types are included by default. add_type("none", std::make_unique("none")); add_type("_type_", std::make_unique("_type_")); + add_type("_varargs_", std::make_unique("_varargs_")); } /*! @@ -41,7 +42,7 @@ Type* TypeSystem::add_type(const std::string& name, std::unique_ptr type) // newly defined! // none/object get to skip these checks because they are roots. - if (name != "object" && name != "none" && name != "_type_") { + if (name != "object" && name != "none" && name != "_type_" && name != "_varargs_") { if (m_forward_declared_types.find(type->get_parent()) != m_forward_declared_types.end()) { fmt::print("[TypeSystem] Type {} has incompletely defined parent {}\n", type->get_name(), type->get_parent()); @@ -155,6 +156,10 @@ TypeSpec TypeSystem::make_typespec(const std::string& name) const { } } +bool TypeSystem::fully_defined_type_exists(const std::string& name) const { + return m_types.find(name) != m_types.end(); +} + /*! * Create a typespec for a function. If the function doesn't return anything, use "none" as the * return type. @@ -230,8 +235,9 @@ Type* TypeSystem::lookup_type(const TypeSpec& ts) const { MethodInfo TypeSystem::add_method(const std::string& type_name, const std::string& method_name, - const TypeSpec& ts) { - return add_method(lookup_type(make_typespec(type_name)), method_name, ts); + const TypeSpec& ts, + bool allow_new_method) { + return add_method(lookup_type(make_typespec(type_name)), method_name, ts, allow_new_method); } /*! @@ -243,7 +249,10 @@ MethodInfo TypeSystem::add_method(const std::string& type_name, * is overriding the "new" method - the TypeSystem will track that because overridden new methods * may have different arguments. */ -MethodInfo TypeSystem::add_method(Type* type, const std::string& method_name, const TypeSpec& ts) { +MethodInfo TypeSystem::add_method(Type* type, + const std::string& method_name, + const TypeSpec& ts, + bool allow_new_method) { if (method_name == "new") { return add_new_method(type, ts); } @@ -281,6 +290,11 @@ MethodInfo TypeSystem::add_method(Type* type, const std::string& method_name, co return existing_info; } else { + if (!allow_new_method) { + fmt::print("[TypeSystem] Attempted to add method {} to type {} but it was not declared.\n", + method_name, type->get_name()); + throw std::runtime_error("illegal method definition"); + } // add a new method! return type->add_method({get_next_method_id(type), method_name, ts, type->get_name()}); } @@ -295,7 +309,7 @@ MethodInfo TypeSystem::add_new_method(Type* type, const TypeSpec& ts) { MethodInfo existing; if (type->get_my_new_method(&existing)) { // it exists! - if (existing.type != ts) { + if (!existing.type.is_compatible_child_method(ts, type->get_name())) { fmt::print( "[TypeSystem] The new method of {} was originally defined as {}, but has been redefined " "as {}\n", @@ -483,7 +497,7 @@ int TypeSystem::add_field_to_type(StructureType* type, // we need to compute the offset ourself! offset = align(type->get_size_in_memory(), field_alignment); } else { - int aligned_offset = align(type->get_size_in_memory(), field_alignment); + int aligned_offset = align(offset, field_alignment); if (offset != aligned_offset) { fmt::print( "[TypeSystem] Tried to overwrite offset of field to be {}, but it is not aligned " @@ -563,13 +577,13 @@ void TypeSystem::add_builtin_types() { // Methods and Fields // OBJECT - add_method(obj_type, "new", make_function_typespec({"symbol", "type", "int32"}, "_type_")); + add_method(obj_type, "new", make_function_typespec({"symbol", "type", "int"}, "_type_")); add_method(obj_type, "delete", make_function_typespec({"_type_"}, "none")); add_method(obj_type, "print", make_function_typespec({"_type_"}, "_type_")); add_method(obj_type, "inspect", make_function_typespec({"_type_"}, "_type_")); add_method(obj_type, "length", - make_function_typespec({"_type_"}, "int32")); // todo - this integer type? - add_method(obj_type, "asize-of", make_function_typespec({"_type_"}, "int32")); + make_function_typespec({"_type_"}, "int")); // todo - this integer type? + add_method(obj_type, "asize-of", make_function_typespec({"_type_"}, "int")); add_method(obj_type, "copy", make_function_typespec({"_type_", "symbol"}, "_type_")); add_method(obj_type, "relocate", make_function_typespec({"_type_", "int32"}, "_type_")); add_method(obj_type, "mem-usage", @@ -580,7 +594,7 @@ void TypeSystem::add_builtin_types() { // the type. Dynamic structures use new-dynamic-structure, which is used exactly once ever. add_method(structure_type, "new", make_function_typespec({"symbol", "type"}, "structure")); // structure_type is a field-less StructureType, so we have to do this to match the runtime. - structure_type->override_size_in_memory(4); + // structure_type->override_size_in_memory(4); // BASIC // we intentionally don't inherit from structure because structure's size is weird. @@ -600,12 +614,12 @@ void TypeSystem::add_builtin_types() { add_method(type_type, "new", make_function_typespec({"symbol", "type", "int"}, "_type_")); add_field_to_type(type_type, "symbol", make_typespec("symbol")); add_field_to_type(type_type, "parent", make_typespec("type")); - add_field_to_type(type_type, "allocated-size", make_typespec("uint16")); // todo, u16 or s16? + add_field_to_type(type_type, "size", make_typespec("uint16")); // actually u16 add_field_to_type(type_type, "psize", make_typespec("uint16")); // todo, u16 or s16. what really is this? - add_field_to_type(type_type, "heap-base", make_typespec("uint16")); // todo - add_field_to_type(type_type, "method-count", make_typespec("uint16")); // todo - add_field_to_type(type_type, "vtable", make_typespec("function"), false, true); + add_field_to_type(type_type, "heap-base", make_typespec("uint16")); // todo + add_field_to_type(type_type, "allocated-length", make_typespec("uint16")); // todo + add_field_to_type(type_type, "method-table", make_typespec("function"), false, true); // STRING builtin_structure_inherit(string_type); @@ -640,6 +654,8 @@ void TypeSystem::add_builtin_types() { // pair pair_type->override_offset(2); + add_method(pair_type, "new", + make_function_typespec({"symbol", "type", "object", "object"}, "_type_")); add_field_to_type(pair_type, "car", make_typespec("object")); add_field_to_type(pair_type, "cdr", make_typespec("object")); @@ -970,4 +986,20 @@ TypeSpec TypeSystem::lowest_common_ancestor(const std::vector& types) result = lowest_common_ancestor(result, types.at(i)); } return result; +} + +TypeSpec coerce_to_reg_type(const TypeSpec& in) { + if (in.arg_count() == 0) { + if (in.base_type() == "int8" || in.base_type() == "int16" || in.base_type() == "int32" || + in.base_type() == "int16") { + return TypeSpec("int"); + } + + if (in.base_type() == "uint8" || in.base_type() == "uint16" || in.base_type() == "uint32" || + in.base_type() == "uint16") { + return TypeSpec("uint"); + } + } + + return in; } \ No newline at end of file diff --git a/common/type_system/TypeSystem.h b/common/type_system/TypeSystem.h index 0e156de785..c62074cb52 100644 --- a/common/type_system/TypeSystem.h +++ b/common/type_system/TypeSystem.h @@ -39,6 +39,7 @@ class TypeSystem { DerefInfo get_deref_info(const TypeSpec& ts); + bool fully_defined_type_exists(const std::string& name) const; TypeSpec make_typespec(const std::string& name) const; TypeSpec make_function_typespec(const std::vector& arg_types, const std::string& return_type); @@ -53,8 +54,12 @@ class TypeSystem { MethodInfo add_method(const std::string& type_name, const std::string& method_name, - const TypeSpec& ts); - MethodInfo add_method(Type* type, const std::string& method_name, const TypeSpec& ts); + const TypeSpec& ts, + bool allow_new_method = true); + MethodInfo add_method(Type* type, + const std::string& method_name, + const TypeSpec& ts, + bool allow_new_method = true); MethodInfo add_new_method(Type* type, const TypeSpec& ts); MethodInfo lookup_method(const std::string& type_name, const std::string& method_name); MethodInfo lookup_new_method(const std::string& type_name); @@ -122,4 +127,6 @@ class TypeSystem { bool m_allow_redefinition = false; }; +TypeSpec coerce_to_reg_type(const TypeSpec& in); + #endif // JAK_TYPESYSTEM_H diff --git a/common/type_system/deftype.cpp b/common/type_system/deftype.cpp index 3b0405ebed..691865ece0 100644 --- a/common/type_system/deftype.cpp +++ b/common/type_system/deftype.cpp @@ -78,24 +78,6 @@ int64_t get_int(const goos::Object& obj) { throw std::runtime_error(obj.print() + " was supposed to be an integer, but isn't"); } -TypeSpec parse_typespec(TypeSystem* type_system, const goos::Object& src) { - if (src.is_symbol()) { - return type_system->make_typespec(symbol_string(src)); - } else if (src.is_pair()) { - TypeSpec ts = type_system->make_typespec(symbol_string(car(&src))); - const auto& rest = *cdr(&src); - - for_each_in_list(rest, - [&](const goos::Object& o) { ts.add_arg(parse_typespec(type_system, o)); }); - - return ts; - } else { - throw std::runtime_error("invalid typespec: " + src.print()); - } - assert(false); - return {}; -} - void add_field(StructureType* structure, TypeSystem* ts, const goos::Object& def) { auto rest = &def; @@ -278,6 +260,24 @@ TypeFlags parse_structure_def(StructureType* type, } // namespace +TypeSpec parse_typespec(TypeSystem* type_system, const goos::Object& src) { + if (src.is_symbol()) { + return type_system->make_typespec(symbol_string(src)); + } else if (src.is_pair()) { + TypeSpec ts = type_system->make_typespec(symbol_string(car(&src))); + const auto& rest = *cdr(&src); + + for_each_in_list(rest, + [&](const goos::Object& o) { ts.add_arg(parse_typespec(type_system, o)); }); + + return ts; + } else { + throw std::runtime_error("invalid typespec: " + src.print()); + } + assert(false); + return {}; +} + DeftypeResult parse_deftype(const goos::Object& deftype, TypeSystem* ts) { auto iter = &deftype; diff --git a/common/type_system/deftype.h b/common/type_system/deftype.h index 13872693da..151601be37 100644 --- a/common/type_system/deftype.h +++ b/common/type_system/deftype.h @@ -22,3 +22,4 @@ struct DeftypeResult { }; DeftypeResult parse_deftype(const goos::Object& deftype, TypeSystem* ts); +TypeSpec parse_typespec(TypeSystem* type_system, const goos::Object& src); diff --git a/common/versions.h b/common/versions.h index a3098572a9..5534a7d15e 100644 --- a/common/versions.h +++ b/common/versions.h @@ -12,8 +12,8 @@ namespace versions { // language version -constexpr s32 GOAL_VERSION_MAJOR = 2; -constexpr s32 GOAL_VERSION_MINOR = 6; +constexpr s32 GOAL_VERSION_MAJOR = 0; +constexpr s32 GOAL_VERSION_MINOR = 1; } // namespace versions // GOAL kernel version diff --git a/decomp.sh b/decomp.sh index 947ec9bf78..69cbe661a9 100755 --- a/decomp.sh +++ b/decomp.sh @@ -3,4 +3,4 @@ # Directory of this script DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -$DIR/build/decompiler/decompiler $DIR/decompiler/config/jak1_ntsc_black_label.jsonc $DIR/iso_data $DIR/decompiler_out \ No newline at end of file +$DIR/build/decompiler/decompiler $DIR/decompiler/config/jak1_ntsc_black_label.jsonc $DIR/iso_data $DIR/decompiler_out diff --git a/decompiler/CMakeLists.txt b/decompiler/CMakeLists.txt index eca54d7d2f..d1b37b8edc 100644 --- a/decompiler/CMakeLists.txt +++ b/decompiler/CMakeLists.txt @@ -12,14 +12,15 @@ add_executable(decompiler util/FileIO.cpp config.cpp util/LispPrint.cpp + util/DecompilerTypeSystem.cpp Function/BasicBlocks.cpp Disasm/InstructionMatching.cpp - TypeSystem/GoalType.cpp - TypeSystem/GoalFunction.cpp - TypeSystem/GoalSymbol.cpp - TypeSystem/TypeInfo.cpp - TypeSystem/TypeSpec.cpp Function/CfgVtx.cpp Function/CfgVtx.h) + Function/CfgVtx.cpp Function/CfgVtx.h + IR/BasicOpBuilder.cpp + IR/IR.cpp) target_link_libraries(decompiler minilzo - common_util) \ No newline at end of file + common_util + type_system + fmt) \ No newline at end of file diff --git a/decompiler/Disasm/Instruction.h b/decompiler/Disasm/Instruction.h index ca3ab99a37..f3ccaf9699 100644 --- a/decompiler/Disasm/Instruction.h +++ b/decompiler/Disasm/Instruction.h @@ -44,6 +44,12 @@ struct InstructionAtom { std::string to_string(const LinkedObjectFile& file) const; bool is_link_or_label() const; + bool is_reg() const { return kind == REGISTER; } + bool is_imm() const { return kind == IMM; } + bool is_label() const { return kind == LABEL; } + bool is_sym() const { return kind == IMM_SYM; } + + bool is_reg(Register r) const { return kind == REGISTER && reg == r; } private: int32_t imm; diff --git a/decompiler/Disasm/InstructionMatching.h b/decompiler/Disasm/InstructionMatching.h index 3fe9232e34..7d67751eac 100644 --- a/decompiler/Disasm/InstructionMatching.h +++ b/decompiler/Disasm/InstructionMatching.h @@ -1,5 +1,10 @@ #pragma once +/*! + * @file InstructionMatching.h + * Utilities for checking if an instruction matches some criteria. + */ + #ifndef JAK_DISASSEMBLER_INSTRUCTIONMATCHING_H #define JAK_DISASSEMBLER_INSTRUCTIONMATCHING_H diff --git a/decompiler/Disasm/OpcodeInfo.cpp b/decompiler/Disasm/OpcodeInfo.cpp index 102493bb26..4ae837be23 100644 --- a/decompiler/Disasm/OpcodeInfo.cpp +++ b/decompiler/Disasm/OpcodeInfo.cpp @@ -1,3 +1,8 @@ +/*! + * @file OpcodeInfo.cpp + * Decoding info for each opcode. + */ + #include "OpcodeInfo.h" #include diff --git a/decompiler/Function/BasicBlocks.h b/decompiler/Function/BasicBlocks.h index 42b1a1fedc..38eefd2f45 100644 --- a/decompiler/Function/BasicBlocks.h +++ b/decompiler/Function/BasicBlocks.h @@ -1,8 +1,5 @@ #pragma once -#ifndef JAK_DISASSEMBLER_BASICBLOCKS_H -#define JAK_DISASSEMBLER_BASICBLOCKS_H - #include #include @@ -21,5 +18,3 @@ struct BasicBlock { std::vector find_blocks_in_function(const LinkedObjectFile& file, int seg, const Function& func); - -#endif // JAK_DISASSEMBLER_BASICBLOCKS_H diff --git a/decompiler/Function/CfgVtx.cpp b/decompiler/Function/CfgVtx.cpp index e7531f8d12..31bdae7d9b 100644 --- a/decompiler/Function/CfgVtx.cpp +++ b/decompiler/Function/CfgVtx.cpp @@ -1637,7 +1637,6 @@ void ControlFlowGraph::flag_early_exit(const std::vector& blocks) { * Build and resolve a Control Flow Graph as much as possible. */ std::shared_ptr build_cfg(const LinkedObjectFile& file, int seg, Function& func) { - printf("build cfg : %s\n", func.guessed_name.to_string().c_str()); auto cfg = std::make_shared(); const auto& blocks = cfg->create_blocks(func.basic_blocks.size()); @@ -1716,13 +1715,6 @@ std::shared_ptr build_cfg(const LinkedObjectFile& file, int se cfg->flag_early_exit(func.basic_blocks); - // if(func.guessed_name.to_string() == "(method 9 thread)") - // cfg->find_cond_w_else(); - - // if (func.guessed_name.to_string() != "looping-code") { - // return cfg; - // } - bool changed = true; while (changed) { changed = false; @@ -1730,11 +1722,9 @@ std::shared_ptr build_cfg(const LinkedObjectFile& file, int se // printf("%s\n", cfg->to_dot().c_str()); // printf("%s\n", cfg->to_form()->toStringPretty().c_str()); - changed = changed | cfg->find_cond_w_else(); - changed = changed | cfg->find_cond_n_else(); + changed = changed || cfg->find_cond_w_else(); + changed = changed || cfg->find_cond_n_else(); changed = changed || cfg->find_while_loop_top_level(); - // //// printf("while loops? %d\n", changed); - //// changed = changed || cfg->find_if_else_top_level(); changed = changed || cfg->find_seq_top_level(); changed = changed || cfg->find_short_circuits(); diff --git a/decompiler/Function/Function.cpp b/decompiler/Function/Function.cpp index cba5ecf577..dd433763d6 100644 --- a/decompiler/Function/Function.cpp +++ b/decompiler/Function/Function.cpp @@ -3,7 +3,7 @@ #include "Function.h" #include "decompiler/Disasm/InstructionMatching.h" #include "decompiler/ObjectFile/LinkedObjectFile.h" -#include "decompiler/TypeSystem/TypeInfo.h" +#include "decompiler/util/DecompilerTypeSystem.h" namespace { std::vector gpr_backups = {make_gpr(Reg::GP), make_gpr(Reg::S5), make_gpr(Reg::S4), @@ -418,7 +418,7 @@ void Function::check_epilogue(const LinkedObjectFile& file) { * * Updates the guessed_name of the function and updates type_info */ -void Function::find_global_function_defs(LinkedObjectFile& file) { +void Function::find_global_function_defs(LinkedObjectFile& file, DecompilerTypeSystem& dts) { int state = 0; int label_id = -1; Register reg; @@ -457,7 +457,8 @@ void Function::find_global_function_defs(LinkedObjectFile& file) { auto& func = file.get_function_at_label(label_id); assert(func.guessed_name.empty()); func.guessed_name.set_as_global(name); - get_type_info().inform_symbol(name, TypeSpec("function")); + dts.add_symbol(name, "function"); + ; // todo - inform function. } @@ -549,4 +550,42 @@ void Function::find_method_defs(LinkedObjectFile& file) { } } } +} + +void Function::add_basic_op(std::shared_ptr op, int start_instr, int end_instr) { + op->is_basic_op = true; + assert(end_instr > start_instr); + + for (int i = start_instr; i < end_instr; i++) { + instruction_to_basic_op[i] = basic_ops.size(); + } + basic_op_to_instruction[basic_ops.size()] = start_instr; + basic_ops.push_back(op); +} + +bool Function::instr_starts_basic_op(int idx) { + auto op = instruction_to_basic_op.find(idx); + if (op != instruction_to_basic_op.end()) { + auto start_instr = basic_op_to_instruction.at(op->second); + return start_instr == idx; + } + return false; +} + +IR* Function::get_basic_op_at_instr(int idx) { + return basic_ops.at(instruction_to_basic_op.at(idx)).get(); +} + +int Function::get_basic_op_count() { + return basic_ops.size(); +} + +int Function::get_failed_basic_op_count() { + int count = 0; + for (auto& x : basic_ops) { + if (dynamic_cast(x.get())) { + count++; + } + } + return count; } \ No newline at end of file diff --git a/decompiler/Function/Function.h b/decompiler/Function/Function.h index 179e51c901..c0420ec055 100644 --- a/decompiler/Function/Function.h +++ b/decompiler/Function/Function.h @@ -8,6 +8,9 @@ #include "decompiler/Disasm/Instruction.h" #include "BasicBlocks.h" #include "CfgVtx.h" +#include "decompiler/IR/IR.h" + +class DecompilerTypeSystem; struct FunctionName { enum class FunctionKind { @@ -60,8 +63,14 @@ class Function { public: Function(int _start_word, int _end_word); void analyze_prologue(const LinkedObjectFile& file); - void find_global_function_defs(LinkedObjectFile& file); + void find_global_function_defs(LinkedObjectFile& file, DecompilerTypeSystem& dts); void find_method_defs(LinkedObjectFile& file); + void add_basic_op(std::shared_ptr op, int start_instr, int end_instr); + bool has_basic_ops() { return !basic_ops.empty(); } + bool instr_starts_basic_op(int idx); + IR* get_basic_op_at_instr(int idx); + int get_basic_op_count(); + int get_failed_basic_op_count(); int segment = -1; int start_word = -1; @@ -115,6 +124,9 @@ class Function { private: void check_epilogue(const LinkedObjectFile& file); + std::vector> basic_ops; + std::unordered_map instruction_to_basic_op; + std::unordered_map basic_op_to_instruction; }; #endif // NEXT_FUNCTION_H diff --git a/decompiler/IR/BasicOpBuilder.cpp b/decompiler/IR/BasicOpBuilder.cpp new file mode 100644 index 0000000000..aa677aa000 --- /dev/null +++ b/decompiler/IR/BasicOpBuilder.cpp @@ -0,0 +1,1412 @@ +#include "BasicOpBuilder.h" +#include "decompiler/Function/Function.h" +#include "decompiler/Function/BasicBlocks.h" +#include "decompiler/Disasm/InstructionMatching.h" + +namespace { + +struct ConvertState { + void reset() {} +}; + +std::shared_ptr make_set(IR_Set::Kind kind, + const std::shared_ptr& dst, + const std::shared_ptr& src) { + return std::make_shared(kind, dst, src); +} + +std::shared_ptr make_reg(Register reg, int idx) { + return std::make_shared(reg, idx); +} + +std::shared_ptr make_sym(const std::string& name) { + return std::make_shared(name); +} + +std::shared_ptr make_sym_value(const std::string& name) { + return std::make_shared(name); +} + +std::shared_ptr make_int(int64_t x) { + return std::make_shared(x); +} + +std::shared_ptr try_or(Instruction& instr, int idx) { + if (is_gpr_3(instr, InstructionKind::OR, {}, make_gpr(Reg::S7), make_gpr(Reg::R0))) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), make_sym("#f")); + } else if (is_gpr_3(instr, InstructionKind::OR, {}, {}, make_gpr(Reg::R0))) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + make_reg(instr.get_src(0).get_reg(), idx)); + } else { + return make_set( + IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::OR, make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_ori(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::ORI && instr.get_src(0).is_reg(make_gpr(Reg::R0)) && + instr.get_src(1).is_imm()) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + make_int(instr.get_src(1).get_imm())); + } else if (instr.kind == InstructionKind::ORI && instr.get_src(1).is_imm()) { + return make_set( + IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::OR, make_reg(instr.get_src(0).get_reg(), idx), + make_int(instr.get_src(1).get_imm()))); + } + return nullptr; +} + +std::shared_ptr try_por(Instruction& instr, int idx) { + if (is_gpr_3(instr, InstructionKind::POR, {}, {}, make_gpr(Reg::R0))) { + return make_set(IR_Set::REG_I128, make_reg(instr.get_dst(0).get_reg(), idx), + make_reg(instr.get_src(0).get_reg(), idx)); + } + return nullptr; +} + +std::shared_ptr try_mtc1(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::MTC1) { + return make_set(IR_Set::GPR_TO_FPR, make_reg(instr.get_dst(0).get_reg(), idx), + make_reg(instr.get_src(0).get_reg(), idx)); + } + return nullptr; +} + +std::shared_ptr try_mfc1(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::MFC1) { + return make_set(IR_Set::FPR_TO_GPR64, make_reg(instr.get_dst(0).get_reg(), idx), + make_reg(instr.get_src(0).get_reg(), idx)); + } + return nullptr; +} + +std::shared_ptr try_lwc1(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::LWC1 && instr.get_dst(0).is_reg() && + instr.get_src(0).is_link_or_label() && instr.get_src(1).is_reg(make_gpr(Reg::FP))) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::FLOAT, 4, std::make_shared(instr.get_src(0).get_label()))); + } else if (instr.kind == InstructionKind::LWC1 && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm() && instr.get_src(0).get_imm() == 0) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_Load::FLOAT, 4, make_reg(instr.get_src(1).get_reg(), idx))); + } else if (instr.kind == InstructionKind::LWC1 && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm()) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::FLOAT, 4, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(1).get_reg(), idx), + std::make_shared(instr.get_src(0).get_imm())))); + } + return nullptr; +} + +std::shared_ptr try_lhu(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::LHU && instr.get_dst(0).is_reg() && + instr.get_src(0).is_link_or_label() && instr.get_src(1).is_reg(make_gpr(Reg::FP))) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::UNSIGNED, 2, + std::make_shared(instr.get_src(0).get_label()))); + } else if (instr.kind == InstructionKind::LHU && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm() && instr.get_src(0).get_imm() == 0) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_Load::UNSIGNED, 2, make_reg(instr.get_src(1).get_reg(), idx))); + } else if (instr.kind == InstructionKind::LHU && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm()) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::UNSIGNED, 2, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(1).get_reg(), idx), + std::make_shared(instr.get_src(0).get_imm())))); + } + return nullptr; +} + +std::shared_ptr try_lh(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::LH && instr.get_dst(0).is_reg() && + instr.get_src(0).is_link_or_label() && instr.get_src(1).is_reg(make_gpr(Reg::FP))) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::SIGNED, 2, std::make_shared(instr.get_src(0).get_label()))); + } else if (instr.kind == InstructionKind::LH && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm() && instr.get_src(0).get_imm() == 0) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_Load::SIGNED, 2, make_reg(instr.get_src(1).get_reg(), idx))); + } else if (instr.kind == InstructionKind::LH && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm()) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::SIGNED, 2, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(1).get_reg(), idx), + std::make_shared(instr.get_src(0).get_imm())))); + } + return nullptr; +} + +std::shared_ptr try_lb(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::LB && instr.get_dst(0).is_reg() && + instr.get_src(0).is_link_or_label() && instr.get_src(1).is_reg(make_gpr(Reg::FP))) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::SIGNED, 1, std::make_shared(instr.get_src(0).get_label()))); + } else if (instr.kind == InstructionKind::LB && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm() && instr.get_src(0).get_imm() == 0) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_Load::SIGNED, 1, make_reg(instr.get_src(1).get_reg(), idx))); + } else if (instr.kind == InstructionKind::LB && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm()) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::SIGNED, 1, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(1).get_reg(), idx), + std::make_shared(instr.get_src(0).get_imm())))); + } + return nullptr; +} + +std::shared_ptr try_lbu(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::LBU && instr.get_dst(0).is_reg() && + instr.get_src(0).is_link_or_label() && instr.get_src(1).is_reg(make_gpr(Reg::FP))) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::UNSIGNED, 1, + std::make_shared(instr.get_src(0).get_label()))); + } else if (instr.kind == InstructionKind::LBU && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm() && instr.get_src(0).get_imm() == 0) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_Load::UNSIGNED, 1, make_reg(instr.get_src(1).get_reg(), idx))); + } else if (instr.kind == InstructionKind::LBU && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm()) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::UNSIGNED, 1, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(1).get_reg(), idx), + std::make_shared(instr.get_src(0).get_imm())))); + } + return nullptr; +} + +std::shared_ptr try_lwu(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::LWU && instr.get_dst(0).is_reg() && + instr.get_src(0).is_link_or_label() && instr.get_src(1).is_reg(make_gpr(Reg::FP))) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::UNSIGNED, 4, + std::make_shared(instr.get_src(0).get_label()))); + } else if (instr.kind == InstructionKind::LWU && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm() && instr.get_src(0).get_imm() == 0) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_Load::UNSIGNED, 4, make_reg(instr.get_src(1).get_reg(), idx))); + } else if (instr.kind == InstructionKind::LWU && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm()) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::UNSIGNED, 4, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(1).get_reg(), idx), + std::make_shared(instr.get_src(0).get_imm())))); + } + return nullptr; +} + +std::shared_ptr try_ld(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::LD && instr.get_dst(0).is_reg() && + instr.get_src(0).is_link_or_label() && instr.get_src(1).is_reg(make_gpr(Reg::FP))) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::UNSIGNED, 8, + std::make_shared(instr.get_src(0).get_label()))); + } else if (instr.kind == InstructionKind::LD && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm() && instr.get_src(0).get_imm() == 0) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_Load::UNSIGNED, 8, make_reg(instr.get_src(1).get_reg(), idx))); + } else if (instr.kind == InstructionKind::LD && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm()) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::UNSIGNED, 8, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(1).get_reg(), idx), + std::make_shared(instr.get_src(0).get_imm())))); + } + return nullptr; +} + +std::shared_ptr try_dsll(Instruction& instr, int idx) { + if (is_gpr_2_imm_int(instr, InstructionKind::DSLL, {}, {}, {})) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::LEFT_SHIFT, + make_reg(instr.get_src(0).get_reg(), idx), + make_int(instr.get_src(1).get_imm()))); + } + return nullptr; +} + +std::shared_ptr try_dsll32(Instruction& instr, int idx) { + if (is_gpr_2_imm_int(instr, InstructionKind::DSLL32, {}, {}, {})) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::LEFT_SHIFT, + make_reg(instr.get_src(0).get_reg(), idx), + make_int(32 + instr.get_src(1).get_imm()))); + } + return nullptr; +} + +std::shared_ptr try_dsra(Instruction& instr, int idx) { + if (is_gpr_2_imm_int(instr, InstructionKind::DSRA, {}, {}, {})) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::RIGHT_SHIFT_ARITH, + make_reg(instr.get_src(0).get_reg(), idx), + make_int(instr.get_src(1).get_imm()))); + } + return nullptr; +} + +std::shared_ptr try_dsra32(Instruction& instr, int idx) { + if (is_gpr_2_imm_int(instr, InstructionKind::DSRA32, {}, {}, {})) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::RIGHT_SHIFT_ARITH, + make_reg(instr.get_src(0).get_reg(), idx), + make_int(32 + instr.get_src(1).get_imm()))); + } + return nullptr; +} + +std::shared_ptr try_dsrl(Instruction& instr, int idx) { + if (is_gpr_2_imm_int(instr, InstructionKind::DSRL, {}, {}, {})) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::RIGHT_SHIFT_LOGIC, + make_reg(instr.get_src(0).get_reg(), idx), + make_int(instr.get_src(1).get_imm()))); + } + return nullptr; +} + +std::shared_ptr try_dsrl32(Instruction& instr, int idx) { + if (is_gpr_2_imm_int(instr, InstructionKind::DSRL32, {}, {}, {})) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::RIGHT_SHIFT_LOGIC, + make_reg(instr.get_src(0).get_reg(), idx), + make_int(32 + instr.get_src(1).get_imm()))); + } + return nullptr; +} + +std::shared_ptr try_float_math_2(Instruction& instr, + int idx, + InstructionKind instr_kind, + IR_FloatMath2::Kind ir_kind) { + if (is_gpr_3(instr, instr_kind, {}, {}, {})) { + return make_set( + IR_Set::REG_FLT, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(ir_kind, make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_daddiu(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::DADDIU && instr.get_src(0).is_reg(make_gpr(Reg::S7)) && + instr.get_src(1).kind == InstructionAtom::IMM_SYM) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + make_sym(instr.get_src(1).get_sym())); + } else if (instr.kind == InstructionKind::DADDIU && instr.get_src(0).is_reg(make_gpr(Reg::FP)) && + instr.get_src(1).kind == InstructionAtom::LABEL) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(instr.get_src(1).get_label())); + } else if (instr.kind == InstructionKind::DADDIU) { + return make_set( + IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::ADD, make_reg(instr.get_src(0).get_reg(), idx), + make_int(instr.get_src(1).get_imm()))); + } + return nullptr; +} + +std::shared_ptr try_lw(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::LW && instr.get_src(1).is_reg(make_gpr(Reg::S7)) && + instr.get_src(0).kind == InstructionAtom::IMM_SYM) { + return make_set(IR_Set::SYM_LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + make_sym_value(instr.get_src(0).get_sym())); + } else if (instr.kind == InstructionKind::LW && instr.get_dst(0).is_reg() && + instr.get_src(0).is_link_or_label() && instr.get_src(1).is_reg(make_gpr(Reg::FP))) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::SIGNED, 4, std::make_shared(instr.get_src(0).get_label()))); + } else if (instr.kind == InstructionKind::LW && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm() && instr.get_src(0).get_imm() == 0) { + return make_set( + IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_Load::SIGNED, 4, make_reg(instr.get_src(1).get_reg(), idx))); + } else if (instr.kind == InstructionKind::LW && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm()) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::SIGNED, 4, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(1).get_reg(), idx), + std::make_shared(instr.get_src(0).get_imm())))); + } + return nullptr; +} + +std::shared_ptr try_lq(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::LQ && instr.get_src(1).is_reg(make_gpr(Reg::S7)) && + instr.get_src(0).kind == InstructionAtom::IMM_SYM) { + assert(false); + } else if (instr.kind == InstructionKind::LQ && instr.get_dst(0).is_reg() && + instr.get_src(0).is_link_or_label() && instr.get_src(1).is_reg(make_gpr(Reg::FP))) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::UNSIGNED, 16, + std::make_shared(instr.get_src(0).get_label()))); + } else if (instr.kind == InstructionKind::LQ && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm() && instr.get_src(0).get_imm() == 0) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_Load::UNSIGNED, 16, + make_reg(instr.get_src(1).get_reg(), idx))); + } else if (instr.kind == InstructionKind::LQ && instr.get_dst(0).is_reg() && + instr.get_src(0).is_imm()) { + return make_set(IR_Set::LOAD, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared( + IR_Load::UNSIGNED, 16, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(1).get_reg(), idx), + std::make_shared(instr.get_src(0).get_imm())))); + } + return nullptr; +} + +std::shared_ptr try_daddu(Instruction& instr, int idx) { + if (is_gpr_3(instr, InstructionKind::DADDU, {}, {}, {}) && + !instr.get_src(0).is_reg(make_gpr(Reg::S7)) && !instr.get_src(1).is_reg(make_gpr(Reg::S7))) { + return make_set( + IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::ADD, make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_dsubu(Instruction& instr, int idx) { + if (is_gpr_3(instr, InstructionKind::DSUBU, {}, {}, {}) && + !instr.get_src(0).is_reg(make_gpr(Reg::S7)) && !instr.get_src(1).is_reg(make_gpr(Reg::S7))) { + return make_set( + IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::SUB, make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_mult3(Instruction& instr, int idx) { + if (is_gpr_3(instr, InstructionKind::MULT3, {}, {}, {}) && + !instr.get_src(0).is_reg(make_gpr(Reg::S7)) && !instr.get_src(1).is_reg(make_gpr(Reg::S7))) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::MUL_SIGNED, + make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_multu3(Instruction& instr, int idx) { + if (is_gpr_3(instr, InstructionKind::MULTU3, {}, {}, {}) && + !instr.get_src(0).is_reg(make_gpr(Reg::S7)) && !instr.get_src(1).is_reg(make_gpr(Reg::S7))) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::MUL_UNSIGNED, + make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_and(Instruction& instr, int idx) { + if (is_gpr_3(instr, InstructionKind::AND, {}, {}, {}) && + !instr.get_src(0).is_reg(make_gpr(Reg::S7)) && !instr.get_src(1).is_reg(make_gpr(Reg::S7))) { + return make_set( + IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::AND, make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_andi(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::ANDI) { + return make_set( + IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::AND, make_reg(instr.get_src(0).get_reg(), idx), + make_int(instr.get_src(1).get_imm()))); + } + return nullptr; +} + +std::shared_ptr try_nor(Instruction& instr, int idx) { + if (is_gpr_3(instr, InstructionKind::NOR, {}, {}, {}) && + !instr.get_src(0).is_reg(make_gpr(Reg::S7)) && instr.get_src(1).is_reg(make_gpr(Reg::R0))) { + return make_set( + IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath1::NOT, make_reg(instr.get_src(0).get_reg(), idx))); + } else if (is_gpr_3(instr, InstructionKind::NOR, {}, {}, {}) && + !instr.get_src(0).is_reg(make_gpr(Reg::S7)) && + !instr.get_src(1).is_reg(make_gpr(Reg::S7))) { + return make_set( + IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::NOR, make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_xor(Instruction& instr, int idx) { + if (is_gpr_3(instr, InstructionKind::XOR, {}, {}, {}) && + !instr.get_src(0).is_reg(make_gpr(Reg::S7)) && !instr.get_src(1).is_reg(make_gpr(Reg::S7))) { + return make_set( + IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::XOR, make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_addiu(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::ADDIU && instr.get_src(0).is_reg(make_gpr(Reg::R0))) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + make_int(instr.get_src(1).get_imm())); + } + return nullptr; +} + +std::shared_ptr try_lui(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::LUI && instr.get_src(0).is_imm()) { + return make_set(IR_Set::REG_64, make_reg(instr.get_dst(0).get_reg(), idx), + make_int(instr.get_src(0).get_imm() << 16)); + } + return nullptr; +} + +std::shared_ptr try_sll(Instruction& instr, int idx) { + (void)idx; + if (is_nop(instr)) { + return std::make_shared(); + } + return nullptr; +} + +std::shared_ptr try_sw(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::SW && instr.get_src(1).is_sym() && + instr.get_src(2).is_reg(make_gpr(Reg::S7))) { + return std::make_shared(IR_Set::SYM_STORE, make_sym_value(instr.get_src(1).get_sym()), + make_reg(instr.get_src(0).get_reg(), idx)); + } else if (instr.kind == InstructionKind::SW && instr.get_src(1).is_imm()) { + return std::make_shared( + IR_Store::INTEGER, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(2).get_reg(), idx), + std::make_shared(instr.get_src(1).get_imm())), + make_reg(instr.get_src(0).get_reg(), idx), 4); + } + return nullptr; +} + +std::shared_ptr try_sb(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::SB && instr.get_src(1).is_imm()) { + return std::make_shared( + IR_Store::INTEGER, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(2).get_reg(), idx), + std::make_shared(instr.get_src(1).get_imm())), + make_reg(instr.get_src(0).get_reg(), idx), 1); + } + return nullptr; +} + +std::shared_ptr try_sh(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::SH && instr.get_src(1).is_imm()) { + return std::make_shared( + IR_Store::INTEGER, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(2).get_reg(), idx), + std::make_shared(instr.get_src(1).get_imm())), + make_reg(instr.get_src(0).get_reg(), idx), 2); + } + return nullptr; +} + +std::shared_ptr try_sd(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::SD && instr.get_src(1).is_imm()) { + return std::make_shared( + IR_Store::INTEGER, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(2).get_reg(), idx), + std::make_shared(instr.get_src(1).get_imm())), + make_reg(instr.get_src(0).get_reg(), idx), 8); + } + return nullptr; +} + +std::shared_ptr try_sq(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::SQ && instr.get_src(1).is_imm()) { + return std::make_shared( + IR_Store::INTEGER, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(2).get_reg(), idx), + std::make_shared(instr.get_src(1).get_imm())), + make_reg(instr.get_src(0).get_reg(), idx), 16); + } + return nullptr; +} + +std::shared_ptr try_swc1(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::SWC1 && instr.get_src(1).is_imm()) { + return std::make_shared( + IR_Store::FLOAT, + std::make_shared( + IR_IntMath2::ADD, make_reg(instr.get_src(2).get_reg(), idx), + std::make_shared(instr.get_src(1).get_imm())), + make_reg(instr.get_src(0).get_reg(), idx), 4); + } + return nullptr; +} + +std::shared_ptr try_cvtws(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::CVTWS) { + return make_set(IR_Set::REG_FLT, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_FloatMath1::FLOAT_TO_INT, + make_reg(instr.get_src(0).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_cvtsw(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::CVTSW) { + return make_set(IR_Set::REG_FLT, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_FloatMath1::INT_TO_FLOAT, + make_reg(instr.get_src(0).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_float_math_1(Instruction& instr, + int idx, + InstructionKind ikind, + IR_FloatMath1::Kind irkind) { + if (instr.kind == ikind) { + return make_set( + IR_Set::REG_FLT, make_reg(instr.get_dst(0).get_reg(), idx), + std::make_shared(irkind, make_reg(instr.get_src(0).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_movs(Instruction& instr, int idx) { + if (instr.kind == InstructionKind::MOVS) { + return make_set(IR_Set::REG_FLT, make_reg(instr.get_dst(0).get_reg(), idx), + make_reg(instr.get_src(0).get_reg(), idx)); + } + return nullptr; +} + +// TWO Instructions +std::shared_ptr try_div(Instruction& instr, Instruction& next_instr, int idx) { + if (instr.kind == InstructionKind::DIV && instr.get_src(0).is_reg() && + instr.get_src(1).is_reg() && next_instr.kind == InstructionKind::MFLO && + next_instr.get_dst(0).is_reg()) { + return make_set(IR_Set::REG_64, make_reg(next_instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::DIV_SIGNED, + make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } else if (instr.kind == InstructionKind::DIV && instr.get_src(0).is_reg() && + instr.get_src(1).is_reg() && next_instr.kind == InstructionKind::MFHI && + next_instr.get_dst(0).is_reg()) { + return make_set(IR_Set::REG_64, make_reg(next_instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::MOD_SIGNED, + make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_divu(Instruction& instr, Instruction& next_instr, int idx) { + if (instr.kind == InstructionKind::DIVU && instr.get_src(0).is_reg() && + instr.get_src(1).is_reg() && next_instr.kind == InstructionKind::MFLO && + next_instr.get_dst(0).is_reg()) { + return make_set(IR_Set::REG_64, make_reg(next_instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::DIV_UNSIGNED, + make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } else if (instr.kind == InstructionKind::DIVU && instr.get_src(0).is_reg() && + instr.get_src(1).is_reg() && next_instr.kind == InstructionKind::MFHI && + next_instr.get_dst(0).is_reg()) { + return make_set(IR_Set::REG_64, make_reg(next_instr.get_dst(0).get_reg(), idx), + std::make_shared(IR_IntMath2::MOD_UNSIGNED, + make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx))); + } + return nullptr; +} + +std::shared_ptr try_jalr(Instruction& instr, Instruction& next_instr, int idx) { + (void)idx; + if (instr.kind == InstructionKind::JALR && instr.get_dst(0).is_reg(make_gpr(Reg::RA)) && + instr.get_src(0).is_reg(make_gpr(Reg::T9)) && + is_gpr_2_imm_int(next_instr, InstructionKind::SLL, make_gpr(Reg::V0), make_gpr(Reg::RA), 0)) { + return std::make_shared(); + } + return nullptr; +} + +BranchDelay get_branch_delay(Instruction& i, int idx) { + if (is_nop(i)) { + return BranchDelay(BranchDelay::NOP); + } else if (is_gpr_3(i, InstructionKind::OR, {}, make_gpr(Reg::S7), make_gpr(Reg::R0))) { + BranchDelay b(BranchDelay::SET_REG_FALSE); + b.destination = make_reg(i.get_dst(0).get_reg(), idx); + return b; + } else if (is_gpr_3(i, InstructionKind::OR, {}, {}, make_gpr(Reg::R0))) { + BranchDelay b(BranchDelay::SET_REG_REG); + b.destination = make_reg(i.get_dst(0).get_reg(), idx); + b.source = make_reg(i.get_src(0).get_reg(), idx); + return b; + } else if (i.kind == InstructionKind::DADDIU && i.get_src(0).is_reg(make_gpr(Reg::S7)) && + i.get_src(1).is_imm() && i.get_src(1).get_imm() == 8) { + BranchDelay b(BranchDelay::SET_REG_TRUE); + b.destination = make_reg(i.get_dst(0).get_reg(), idx); + return b; + } + BranchDelay b(BranchDelay::UNKNOWN); + return b; +} + +std::shared_ptr try_bne(Instruction& instr, Instruction& next_instr, int idx) { + if (instr.kind == InstructionKind::BNE && instr.get_src(1).is_reg(make_gpr(Reg::R0))) { + return std::make_shared( + Condition(Condition::NONZERO, make_reg(instr.get_src(0).get_reg(), idx), nullptr, nullptr), + instr.get_src(2).get_label(), get_branch_delay(next_instr, idx), false); + } else if (instr.kind == InstructionKind::BNE && instr.get_src(0).is_reg(make_gpr(Reg::S7))) { + return std::make_shared( + Condition(Condition::TRUTHY, make_reg(instr.get_src(1).get_reg(), idx), nullptr, nullptr), + instr.get_src(2).get_label(), get_branch_delay(next_instr, idx), false); + } else if (instr.kind == InstructionKind::BNE) { + return std::make_shared( + Condition(Condition::NOT_EQUAL, make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx), nullptr), + instr.get_src(2).get_label(), get_branch_delay(next_instr, idx), false); + } + return nullptr; +} + +std::shared_ptr try_bnel(Instruction& instr, Instruction& next_instr, int idx) { + if (instr.kind == InstructionKind::BNEL && instr.get_src(0).is_reg(make_gpr(Reg::S7))) { + return std::make_shared( + Condition(Condition::TRUTHY, make_reg(instr.get_src(1).get_reg(), idx), nullptr, nullptr), + instr.get_src(2).get_label(), get_branch_delay(next_instr, idx), true); + } else if (instr.kind == InstructionKind::BNEL) { + // return std::make_shared(IR_Branch2::NOT_EQUAL, instr.get_src(2).get_label(), + // make_reg(instr.get_src(0).get_reg(), idx), + // make_reg(instr.get_src(1).get_reg(), idx), + // get_branch_delay(next_instr, idx), true); + } + return nullptr; +} + +std::shared_ptr try_beql(Instruction& instr, Instruction& next_instr, int idx) { + if (instr.kind == InstructionKind::BEQL && instr.get_src(0).is_reg(make_gpr(Reg::S7))) { + return std::make_shared( + Condition(Condition::FALSE, make_reg(instr.get_src(1).get_reg(), idx), nullptr, nullptr), + instr.get_src(2).get_label(), get_branch_delay(next_instr, idx), true); + } else if (instr.kind == InstructionKind::BEQL) { + return std::make_shared( + Condition(Condition::EQUAL, make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx), nullptr), + instr.get_src(2).get_label(), get_branch_delay(next_instr, idx), true); + } + return nullptr; +} + +std::shared_ptr try_beq(Instruction& instr, Instruction& next_instr, int idx) { + if (instr.kind == InstructionKind::BEQ && instr.get_src(0).is_reg(make_gpr(Reg::R0)) && + instr.get_src(1).is_reg(make_gpr(Reg::R0))) { + return std::make_shared(Condition(Condition::ALWAYS, nullptr, nullptr, nullptr), + instr.get_src(2).get_label(), + get_branch_delay(next_instr, idx), false); + } else if (instr.kind == InstructionKind::BEQ && instr.get_src(0).is_reg(make_gpr(Reg::S7))) { + return std::make_shared( + Condition(Condition::FALSE, make_reg(instr.get_src(1).get_reg(), idx), nullptr, nullptr), + instr.get_src(2).get_label(), get_branch_delay(next_instr, idx), false); + } else if (instr.kind == InstructionKind::BEQ) { + return std::make_shared( + Condition(Condition::EQUAL, make_reg(instr.get_src(0).get_reg(), idx), + make_reg(instr.get_src(1).get_reg(), idx), nullptr), + instr.get_src(2).get_label(), get_branch_delay(next_instr, idx), false); + } + return nullptr; +} + +std::shared_ptr try_daddiu(Instruction& i0, Instruction& i1, int idx) { + if (i0.kind == InstructionKind::DADDIU && i1.kind == InstructionKind::MOVN && + i0.get_src(0).get_reg() == make_gpr(Reg::S7)) { + auto dst_reg = i0.get_dst(0).get_reg(); + auto src_reg = i1.get_src(1).get_reg(); + assert(i0.get_src(0).get_reg() == make_gpr(Reg::S7)); + assert(i0.get_src(1).get_imm() == 8); + assert(i1.get_dst(0).get_reg() == dst_reg); + assert(i1.get_src(0).get_reg() == make_gpr(Reg::S7)); + return make_set(IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared( + Condition(Condition::ZERO, make_reg(src_reg, idx), nullptr, nullptr))); + } else if (i0.kind == InstructionKind::DADDIU && i1.kind == InstructionKind::MOVZ && + i0.get_src(0).get_reg() == make_gpr(Reg::S7)) { + auto dst_reg = i0.get_dst(0).get_reg(); + auto src_reg = i1.get_src(1).get_reg(); + assert(i0.get_src(0).get_reg() == make_gpr(Reg::S7)); + assert(i0.get_src(1).get_imm() == 8); + assert(i1.get_dst(0).get_reg() == dst_reg); + assert(i1.get_src(0).get_reg() == make_gpr(Reg::S7)); + return make_set(IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared( + Condition(Condition::NONZERO, make_reg(src_reg, idx), nullptr, nullptr))); + } + return nullptr; +} + +std::shared_ptr try_lui(Instruction& i0, Instruction& i1, int idx) { + if (i0.kind == InstructionKind::LUI && i1.kind == InstructionKind::ORI && + i0.get_src(0).is_label() && i1.get_src(1).is_label()) { + assert(i0.get_dst(0).get_reg() == i1.get_src(0).get_reg()); + assert(i0.get_src(0).get_label() == i1.get_src(1).get_label()); + auto op = make_set(IR_Set::REG_64, make_reg(i1.get_dst(0).get_reg(), idx), + std::make_shared(i0.get_src(0).get_label())); + if (i0.get_dst(0).get_reg() != i1.get_dst(0).get_reg()) { + op->clobber = make_reg(i0.get_dst(0).get_reg(), idx); + } + return op; + } else if (i0.kind == InstructionKind::LUI && i1.kind == InstructionKind::ORI && + i0.get_src(0).is_imm() && i1.get_src(1).is_imm() && + i0.get_dst(0).get_reg() == i1.get_src(0).get_reg()) { + auto op = make_set( + IR_Set::REG_64, make_reg(i1.get_dst(0).get_reg(), idx), + make_int((int64_t(i1.get_src(1).get_imm()) + int64_t(i0.get_src(0).get_imm() << 16)))); + if (i0.get_dst(0).get_reg() != i1.get_dst(0).get_reg()) { + op->clobber = make_reg(i0.get_dst(0).get_reg(), idx); + } + return op; + } + return nullptr; +} + +// THREE OP +std::shared_ptr try_dsubu(Instruction& i0, Instruction& i1, Instruction& i2, int idx) { + if (i0.kind == InstructionKind::DSUBU && i1.kind == InstructionKind::DADDIU && + i2.kind == InstructionKind::MOVN) { + // check for equality + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto src1_reg = i0.get_src(1).get_reg(); + auto dst_reg = i1.get_dst(0).get_reg(); + assert(i1.get_src(0).get_reg() == make_gpr(Reg::S7)); + assert(i1.get_src(1).get_imm() == 8); + assert(i2.get_dst(0).get_reg() == dst_reg); + assert(i2.get_src(0).get_reg() == make_gpr(Reg::S7)); + assert(i2.get_src(1).get_reg() == clobber_reg); + return make_set(IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared( + Condition(Condition::EQUAL, make_reg(src0_reg, idx), + make_reg(src1_reg, idx), make_reg(clobber_reg, idx)))); + } else if (i0.kind == InstructionKind::DSUBU && i1.kind == InstructionKind::DADDIU && + i2.kind == InstructionKind::MOVZ) { + // check for equality + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto src1_reg = i0.get_src(1).get_reg(); + auto dst_reg = i1.get_dst(0).get_reg(); + assert(i1.get_src(0).get_reg() == make_gpr(Reg::S7)); + assert(i1.get_src(1).get_imm() == 8); + assert(i2.get_dst(0).get_reg() == dst_reg); + assert(i2.get_src(0).get_reg() == make_gpr(Reg::S7)); + if (i2.get_src(1).get_reg() != clobber_reg) { + return nullptr; // TODO! + } + return make_set(IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared( + Condition(Condition::NOT_EQUAL, make_reg(src0_reg, idx), + make_reg(src1_reg, idx), make_reg(clobber_reg, idx)))); + } + return nullptr; +} + +std::shared_ptr try_slt(Instruction& i0, Instruction& i1, Instruction& i2, int idx) { + if (i0.kind == InstructionKind::SLT && i1.kind == InstructionKind::BNE) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto src1_reg = i0.get_src(1).get_reg(); + assert(i1.get_src(0).get_reg() == clobber_reg); + assert(i1.get_src(1).get_reg() == make_gpr(Reg::R0)); + return std::make_shared( + Condition(Condition::LESS_THAN_SIGNED, make_reg(src0_reg, idx), make_reg(src1_reg, idx), + make_reg(clobber_reg, idx)), + i1.get_src(2).get_label(), get_branch_delay(i2, idx), false); + } else if (i0.kind == InstructionKind::SLT && i1.kind == InstructionKind::DADDIU && + i2.kind == InstructionKind::MOVZ) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto src1_reg = i0.get_src(1).get_reg(); + auto dst_reg = i1.get_dst(0).get_reg(); + assert(i1.get_src(0).is_reg(make_gpr(Reg::S7))); + assert(i1.get_src(1).get_imm() == 8); + assert(i2.get_dst(0).get_reg() == dst_reg); + assert(i2.get_src(0).get_reg() == make_gpr(Reg::S7)); + if (i2.get_src(1).get_reg() != clobber_reg) { + return nullptr; // TODO! + } + return make_set(IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared( + Condition(Condition::LESS_THAN_SIGNED, make_reg(src0_reg, idx), + make_reg(src1_reg, idx), make_reg(clobber_reg, idx)))); + } else if (i0.kind == InstructionKind::SLT && i1.kind == InstructionKind::BEQ) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto src1_reg = i0.get_src(1).get_reg(); + assert(i1.get_src(0).get_reg() == clobber_reg); + assert(i1.get_src(1).get_reg() == make_gpr(Reg::R0)); + return std::make_shared( + Condition(Condition::GEQ_SIGNED, make_reg(src0_reg, idx), make_reg(src1_reg, idx), + make_reg(clobber_reg, idx)), + i1.get_src(2).get_label(), get_branch_delay(i2, idx), false); + } else if (i0.kind == InstructionKind::SLT && i1.kind == InstructionKind::DADDIU && + i2.kind == InstructionKind::MOVN) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto src1_reg = i0.get_src(1).get_reg(); + auto dst_reg = i1.get_dst(0).get_reg(); + assert(i1.get_src(0).is_reg(make_gpr(Reg::S7))); + assert(i1.get_src(1).get_imm() == 8); + assert(i2.get_dst(0).get_reg() == dst_reg); + assert(i2.get_src(0).get_reg() == make_gpr(Reg::S7)); + if (i2.get_src(1).get_reg() != clobber_reg) { + return nullptr; // TODO! + } + return make_set(IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared( + Condition(Condition::GEQ_SIGNED, make_reg(src0_reg, idx), + make_reg(src1_reg, idx), make_reg(clobber_reg, idx)))); + } + return nullptr; +} + +std::shared_ptr try_slti(Instruction& i0, Instruction& i1, Instruction& i2, int idx) { + auto src1 = make_int(i0.get_src(1).get_imm()); + if (i0.kind == InstructionKind::SLTI && i1.kind == InstructionKind::BNE) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + assert(i1.get_src(0).get_reg() == clobber_reg); + assert(i1.get_src(1).get_reg() == make_gpr(Reg::R0)); + return std::make_shared( + Condition(Condition::LESS_THAN_SIGNED, make_reg(src0_reg, idx), src1, + make_reg(clobber_reg, idx)), + i1.get_src(2).get_label(), get_branch_delay(i2, idx), false); + } else if (i0.kind == InstructionKind::SLTI && i1.kind == InstructionKind::DADDIU && + i2.kind == InstructionKind::MOVZ) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto dst_reg = i1.get_dst(0).get_reg(); + assert(i1.get_src(0).is_reg(make_gpr(Reg::S7))); + assert(i1.get_src(1).get_imm() == 8); + assert(i2.get_dst(0).get_reg() == dst_reg); + assert(i2.get_src(0).get_reg() == make_gpr(Reg::S7)); + if (i2.get_src(1).get_reg() != clobber_reg) { + return nullptr; // TODO! + } + return make_set( + IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared(Condition(Condition::LESS_THAN_SIGNED, make_reg(src0_reg, idx), + src1, make_reg(clobber_reg, idx)))); + } else if (i0.kind == InstructionKind::SLTI && i1.kind == InstructionKind::BEQ) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + assert(i1.get_src(0).get_reg() == clobber_reg); + assert(i1.get_src(1).get_reg() == make_gpr(Reg::R0)); + return std::make_shared( + Condition(Condition::GEQ_SIGNED, make_reg(src0_reg, idx), src1, make_reg(clobber_reg, idx)), + i1.get_src(2).get_label(), get_branch_delay(i2, idx), false); + } else if (i0.kind == InstructionKind::SLTI && i1.kind == InstructionKind::DADDIU && + i2.kind == InstructionKind::MOVN) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto dst_reg = i1.get_dst(0).get_reg(); + assert(i1.get_src(0).is_reg(make_gpr(Reg::S7))); + assert(i1.get_src(1).get_imm() == 8); + assert(i2.get_dst(0).get_reg() == dst_reg); + assert(i2.get_src(0).get_reg() == make_gpr(Reg::S7)); + if (i2.get_src(1).get_reg() != clobber_reg) { + return nullptr; // TODO! + } + return make_set( + IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared(Condition(Condition::GEQ_SIGNED, make_reg(src0_reg, idx), src1, + make_reg(clobber_reg, idx)))); + } + return nullptr; +} + +std::shared_ptr try_sltiu(Instruction& i0, Instruction& i1, Instruction& i2, int idx) { + auto src1 = make_int(i0.get_src(1).get_imm()); + if (i0.kind == InstructionKind::SLTIU && i1.kind == InstructionKind::BNE) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + assert(i1.get_src(0).get_reg() == clobber_reg); + assert(i1.get_src(1).get_reg() == make_gpr(Reg::R0)); + return std::make_shared( + Condition(Condition::LESS_THAN_UNSIGNED, make_reg(src0_reg, idx), src1, + make_reg(clobber_reg, idx)), + i1.get_src(2).get_label(), get_branch_delay(i2, idx), false); + } else if (i0.kind == InstructionKind::SLTIU && i1.kind == InstructionKind::DADDIU && + i2.kind == InstructionKind::MOVZ) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto dst_reg = i1.get_dst(0).get_reg(); + assert(i1.get_src(0).is_reg(make_gpr(Reg::S7))); + assert(i1.get_src(1).get_imm() == 8); + assert(i2.get_dst(0).get_reg() == dst_reg); + assert(i2.get_src(0).get_reg() == make_gpr(Reg::S7)); + if (i2.get_src(1).get_reg() != clobber_reg) { + return nullptr; // TODO! + } + return make_set(IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared(Condition(Condition::LESS_THAN_UNSIGNED, + make_reg(src0_reg, idx), src1, + make_reg(clobber_reg, idx)))); + } else if (i0.kind == InstructionKind::SLTIU && i1.kind == InstructionKind::BEQ) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + assert(i1.get_src(0).get_reg() == clobber_reg); + assert(i1.get_src(1).get_reg() == make_gpr(Reg::R0)); + return std::make_shared(Condition(Condition::GEQ_UNSIGNED, make_reg(src0_reg, idx), + src1, make_reg(clobber_reg, idx)), + i1.get_src(2).get_label(), get_branch_delay(i2, idx), false); + } else if (i0.kind == InstructionKind::SLTIU && i1.kind == InstructionKind::DADDIU && + i2.kind == InstructionKind::MOVN) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto dst_reg = i1.get_dst(0).get_reg(); + assert(i1.get_src(0).is_reg(make_gpr(Reg::S7))); + assert(i1.get_src(1).get_imm() == 8); + assert(i2.get_dst(0).get_reg() == dst_reg); + assert(i2.get_src(0).get_reg() == make_gpr(Reg::S7)); + if (i2.get_src(1).get_reg() != clobber_reg) { + return nullptr; // TODO! + } + return make_set( + IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared(Condition(Condition::GEQ_UNSIGNED, make_reg(src0_reg, idx), + src1, make_reg(clobber_reg, idx)))); + } + return nullptr; +} + +std::shared_ptr try_ceqs(Instruction& i0, Instruction& i1, Instruction& i2, int idx) { + if (i0.kind == InstructionKind::CEQS && i1.kind == InstructionKind::BC1T) { + return std::make_shared( + Condition(Condition::FLOAT_EQUAL, make_reg(i0.get_src(0).get_reg(), idx), + make_reg(i0.get_src(1).get_reg(), idx), nullptr), + i1.get_src(0).get_label(), get_branch_delay(i2, idx), false); + } else if (i0.kind == InstructionKind::CEQS && i1.kind == InstructionKind::BC1F) { + return std::make_shared( + Condition(Condition::FLOAT_NOT_EQUAL, make_reg(i0.get_src(0).get_reg(), idx), + make_reg(i0.get_src(1).get_reg(), idx), nullptr), + i1.get_src(0).get_label(), get_branch_delay(i2, idx), false); + } + return nullptr; +} + +std::shared_ptr try_clts(Instruction& i0, Instruction& i1, Instruction& i2, int idx) { + if (i0.kind == InstructionKind::CLTS && i1.kind == InstructionKind::BC1T) { + return std::make_shared( + Condition(Condition::FLOAT_LESS_THAN, make_reg(i0.get_src(0).get_reg(), idx), + make_reg(i0.get_src(1).get_reg(), idx), nullptr), + i1.get_src(0).get_label(), get_branch_delay(i2, idx), false); + } else if (i0.kind == InstructionKind::CLTS && i1.kind == InstructionKind::BC1F) { + return std::make_shared( + Condition(Condition::FLOAT_GEQ, make_reg(i0.get_src(0).get_reg(), idx), + make_reg(i0.get_src(1).get_reg(), idx), nullptr), + i1.get_src(0).get_label(), get_branch_delay(i2, idx), false); + } + return nullptr; +} + +std::shared_ptr try_sltu(Instruction& i0, Instruction& i1, Instruction& i2, int idx) { + if (i0.kind == InstructionKind::SLTU && i1.kind == InstructionKind::BNE) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto src1_reg = i0.get_src(1).get_reg(); + assert(i1.get_src(0).get_reg() == clobber_reg); + assert(i1.get_src(1).get_reg() == make_gpr(Reg::R0)); + return std::make_shared( + Condition(Condition::LESS_THAN_UNSIGNED, make_reg(src0_reg, idx), make_reg(src1_reg, idx), + make_reg(clobber_reg, idx)), + i1.get_src(2).get_label(), get_branch_delay(i2, idx), false); + } else if (i0.kind == InstructionKind::SLTU && i1.kind == InstructionKind::DADDIU && + i2.kind == InstructionKind::MOVZ) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto src1_reg = i0.get_src(1).get_reg(); + auto dst_reg = i1.get_dst(0).get_reg(); + assert(i1.get_src(0).is_reg(make_gpr(Reg::S7))); + assert(i1.get_src(1).get_imm() == 8); + assert(i2.get_dst(0).get_reg() == dst_reg); + assert(i2.get_src(0).get_reg() == make_gpr(Reg::S7)); + if (i2.get_src(1).get_reg() != clobber_reg) { + return nullptr; // TODO! + } + return make_set(IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared( + Condition(Condition::LESS_THAN_UNSIGNED, make_reg(src0_reg, idx), + make_reg(src1_reg, idx), make_reg(clobber_reg, idx)))); + } else if (i0.kind == InstructionKind::SLTU && i1.kind == InstructionKind::BEQ) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto src1_reg = i0.get_src(1).get_reg(); + assert(i1.get_src(0).get_reg() == clobber_reg); + assert(i1.get_src(1).get_reg() == make_gpr(Reg::R0)); + return std::make_shared( + Condition(Condition::GEQ_UNSIGNED, make_reg(src0_reg, idx), make_reg(src1_reg, idx), + make_reg(clobber_reg, idx)), + i1.get_src(2).get_label(), get_branch_delay(i2, idx), false); + } else if (i0.kind == InstructionKind::SLTU && i1.kind == InstructionKind::DADDIU && + i2.kind == InstructionKind::MOVN) { + auto clobber_reg = i0.get_dst(0).get_reg(); + auto src0_reg = i0.get_src(0).get_reg(); + auto src1_reg = i0.get_src(1).get_reg(); + auto dst_reg = i1.get_dst(0).get_reg(); + assert(i1.get_src(0).is_reg(make_gpr(Reg::S7))); + assert(i1.get_src(1).get_imm() == 8); + assert(i2.get_dst(0).get_reg() == dst_reg); + assert(i2.get_src(0).get_reg() == make_gpr(Reg::S7)); + if (i2.get_src(1).get_reg() != clobber_reg) { + return nullptr; // TODO! + } + return make_set(IR_Set::REG_64, make_reg(dst_reg, idx), + std::make_shared( + Condition(Condition::GEQ_UNSIGNED, make_reg(src0_reg, idx), + make_reg(src1_reg, idx), make_reg(clobber_reg, idx)))); + } + return nullptr; +} + +// five op +std::shared_ptr try_lwu(Instruction& i0, + Instruction& i1, + Instruction& i2, + Instruction& i3, + Instruction& i4, + int idx) { + auto s6 = make_gpr(Reg::S6); + if (i0.kind == InstructionKind::LWU && i0.get_dst(0).is_reg(s6) && + i0.get_src(0).get_imm() == 44 && i0.get_src(1).is_reg(s6) && + i1.kind == InstructionKind::MTLO1 && i1.get_src(0).is_reg(s6) && + i2.kind == InstructionKind::LWU && i2.get_dst(0).is_reg(s6) && + i2.get_src(0).get_imm() == 12 && i2.get_src(1).is_reg(s6) && + i3.kind == InstructionKind::JALR && i3.get_dst(0).is_reg(make_gpr(Reg::RA)) && + i3.get_src(0).is_reg(s6) && i4.kind == InstructionKind::MFLO1 && i4.get_dst(0).is_reg(s6)) { + return std::make_shared(); + } + return nullptr; +} + +} // namespace + +void add_basic_ops_to_block(Function* func, const BasicBlock& block, LinkedObjectFile* file) { + ConvertState state; + + for (int instr = block.start_word; instr < block.end_word; instr++) { + auto& i = func->instructions.at(instr); + + int length = 0; + + std::shared_ptr result = nullptr; + if (instr + 4 < block.end_word) { + auto& i1 = func->instructions.at(instr + 1); + auto& i2 = func->instructions.at(instr + 2); + auto& i3 = func->instructions.at(instr + 3); + auto& i4 = func->instructions.at(instr + 4); + switch (i.kind) { + case InstructionKind::LWU: + result = try_lwu(i, i1, i2, i3, i4, instr); + break; + default: + result = nullptr; + } + if (result) { + length = 5; + } + } + + if (!result && instr + 2 < block.end_word) { + auto& next = func->instructions.at(instr + 1); + auto& next_next = func->instructions.at(instr + 2); + switch (i.kind) { + case InstructionKind::DSUBU: + result = try_dsubu(i, next, next_next, instr); + break; + case InstructionKind::SLT: + result = try_slt(i, next, next_next, instr); + break; + case InstructionKind::SLTI: + result = try_slti(i, next, next_next, instr); + break; + case InstructionKind::SLTU: + result = try_sltu(i, next, next_next, instr); + break; + case InstructionKind::SLTIU: + result = try_sltiu(i, next, next_next, instr); + break; + case InstructionKind::CEQS: + result = try_ceqs(i, next, next_next, instr); + break; + case InstructionKind::CLTS: + result = try_clts(i, next, next_next, instr); + break; + default: + result = nullptr; + } + + if (result) { + length = 3; + } + } + + if (!result && instr + 1 < block.end_word) { + auto& next = func->instructions.at(instr + 1); + // single op failed, try double + switch (i.kind) { + case InstructionKind::DIV: + result = try_div(i, next, instr); + break; + case InstructionKind::DIVU: + result = try_divu(i, next, instr); + break; + case InstructionKind::JALR: + result = try_jalr(i, next, instr); + break; + case InstructionKind::BNE: + result = try_bne(i, next, instr); + break; + case InstructionKind::BNEL: + result = try_bnel(i, next, instr); + break; + case InstructionKind::BEQ: + result = try_beq(i, next, instr); + break; + case InstructionKind::BEQL: + result = try_beql(i, next, instr); + break; + case InstructionKind::DADDIU: + result = try_daddiu(i, next, instr); + break; + case InstructionKind::LUI: + result = try_lui(i, next, instr); + break; + default: + result = nullptr; + } + + if (result) { + length = 2; + } + } + + if (!result) { + switch (i.kind) { + case InstructionKind::OR: + result = try_or(i, instr); + break; + case InstructionKind::ORI: + result = try_ori(i, instr); + break; + case InstructionKind::DADDIU: + result = try_daddiu(i, instr); + break; + case InstructionKind::AND: + result = try_and(i, instr); + break; + case InstructionKind::ANDI: + result = try_andi(i, instr); + break; + case InstructionKind::NOR: + result = try_nor(i, instr); + break; + case InstructionKind::XOR: + result = try_xor(i, instr); + break; + case InstructionKind::LWC1: + result = try_lwc1(i, instr); + break; + case InstructionKind::MTC1: + result = try_mtc1(i, instr); + break; + case InstructionKind::DIVS: + result = try_float_math_2(i, instr, InstructionKind::DIVS, IR_FloatMath2::DIV); + break; + case InstructionKind::SUBS: + result = try_float_math_2(i, instr, InstructionKind::SUBS, IR_FloatMath2::SUB); + break; + case InstructionKind::ADDS: + result = try_float_math_2(i, instr, InstructionKind::ADDS, IR_FloatMath2::ADD); + break; + case InstructionKind::MULS: + result = try_float_math_2(i, instr, InstructionKind::MULS, IR_FloatMath2::MUL); + break; + case InstructionKind::ABSS: + result = try_float_math_1(i, instr, InstructionKind::ABSS, IR_FloatMath1::ABS); + break; + case InstructionKind::NEGS: + result = try_float_math_1(i, instr, InstructionKind::NEGS, IR_FloatMath1::NEG); + break; + case InstructionKind::SQRTS: + result = try_float_math_1(i, instr, InstructionKind::SQRTS, IR_FloatMath1::SQRT); + break; + case InstructionKind::MINS: + result = try_float_math_2(i, instr, InstructionKind::MINS, IR_FloatMath2::MIN); + break; + case InstructionKind::MAXS: + result = try_float_math_2(i, instr, InstructionKind::MAXS, IR_FloatMath2::MAX); + break; + case InstructionKind::MOVS: + result = try_movs(i, instr); + break; + case InstructionKind::MFC1: + result = try_mfc1(i, instr); + break; + case InstructionKind::DADDU: + result = try_daddu(i, instr); + break; + case InstructionKind::DSUBU: + result = try_dsubu(i, instr); + break; + case InstructionKind::MULT3: + result = try_mult3(i, instr); + break; + case InstructionKind::MULTU3: + result = try_multu3(i, instr); + break; + case InstructionKind::POR: + result = try_por(i, instr); + break; + case InstructionKind::LBU: + result = try_lbu(i, instr); + break; + case InstructionKind::LHU: + result = try_lhu(i, instr); + break; + case InstructionKind::LB: + result = try_lb(i, instr); + break; + case InstructionKind::LH: + result = try_lh(i, instr); + break; + case InstructionKind::LW: + result = try_lw(i, instr); + break; + case InstructionKind::LWU: + result = try_lwu(i, instr); + break; + case InstructionKind::LD: + result = try_ld(i, instr); + break; + case InstructionKind::LQ: + result = try_lq(i, instr); + break; + case InstructionKind::DSRA: + result = try_dsra(i, instr); + break; + case InstructionKind::DSRA32: + result = try_dsra32(i, instr); + break; + case InstructionKind::DSRL: + result = try_dsrl(i, instr); + break; + case InstructionKind::DSRL32: + result = try_dsrl32(i, instr); + break; + case InstructionKind::DSLL: + result = try_dsll(i, instr); + break; + case InstructionKind::DSLL32: + result = try_dsll32(i, instr); + break; + case InstructionKind::ADDIU: + result = try_addiu(i, instr); + break; + case InstructionKind::LUI: + result = try_lui(i, instr); + break; + case InstructionKind::SLL: + result = try_sll(i, instr); + break; + case InstructionKind::SB: + result = try_sb(i, instr); + break; + case InstructionKind::SH: + result = try_sh(i, instr); + break; + case InstructionKind::SW: + result = try_sw(i, instr); + break; + case InstructionKind::SD: + result = try_sd(i, instr); + break; + case InstructionKind::SQ: + result = try_sq(i, instr); + break; + case InstructionKind::SWC1: + result = try_swc1(i, instr); + break; + case InstructionKind::CVTWS: + result = try_cvtws(i, instr); + break; + case InstructionKind::CVTSW: + result = try_cvtsw(i, instr); + break; + default: + result = nullptr; + } + + if (result) { + length = 1; + } + } + + // everything failed + if (!result) { + state.reset(); + // temp hack for debug: + printf("Instruction -> BasicOp failed on %s\n", i.to_string(*file).c_str()); + func->add_basic_op(std::make_shared(), instr, instr + 1); + } else { + func->add_basic_op(result, instr, instr + length); + instr += (length - 1); + } + } +} diff --git a/decompiler/IR/BasicOpBuilder.h b/decompiler/IR/BasicOpBuilder.h new file mode 100644 index 0000000000..b7a2b553d8 --- /dev/null +++ b/decompiler/IR/BasicOpBuilder.h @@ -0,0 +1,13 @@ +/*! + * @file BasicOpBuilder.h + * Analyzes a basic block and converts instructions to BasicOps. + * These will be used later to convert the Cfg into the nested IR format. + */ + +#pragma once + +class Function; +struct BasicBlock; +class LinkedObjectFile; + +void add_basic_ops_to_block(Function* func, const BasicBlock& block, LinkedObjectFile* file); \ No newline at end of file diff --git a/decompiler/IR/IR.cpp b/decompiler/IR/IR.cpp new file mode 100644 index 0000000000..2b6ba34187 --- /dev/null +++ b/decompiler/IR/IR.cpp @@ -0,0 +1,391 @@ +#include "IR.h" +#include "decompiler/ObjectFile/LinkedObjectFile.h" + +std::string IR::print(const LinkedObjectFile& file) const { + return to_form(file)->toStringPretty(); +} + +std::shared_ptr
IR_Register::to_form(const LinkedObjectFile& file) const { + (void)file; + return toForm(reg.to_charp()); +} + +std::shared_ptr IR_Set::to_form(const LinkedObjectFile& file) const { + return buildList(toForm("set!"), dst->to_form(file), src->to_form(file)); +} + +std::shared_ptr IR_Store::to_form(const LinkedObjectFile& file) const { + std::string store_operator; + switch (kind) { + case FLOAT: + store_operator = "s.f"; + break; + case INTEGER: + switch (size) { + case 1: + store_operator = "s.b"; + break; + case 2: + store_operator = "s.h"; + break; + case 4: + store_operator = "s.w"; + break; + case 8: + store_operator = "s.d"; + break; + case 16: + store_operator = "s.q"; + break; + default: + assert(false); + } + break; + default: + assert(false); + } + + return buildList(toForm(store_operator), dst->to_form(file), src->to_form(file)); +} + +std::shared_ptr IR_Failed::to_form(const LinkedObjectFile& file) const { + (void)file; + return buildList("INVALID-OPERATION"); +} + +std::shared_ptr IR_Symbol::to_form(const LinkedObjectFile& file) const { + (void)file; + return toForm("'" + name); +} + +std::shared_ptr IR_SymbolValue::to_form(const LinkedObjectFile& file) const { + (void)file; + return toForm(name); +} + +std::shared_ptr IR_StaticAddress::to_form(const LinkedObjectFile& file) const { + // return buildList(toForm("&"), file.get_label_name(label_id)); + return toForm(file.get_label_name(label_id)); +} + +std::shared_ptr IR_Load::to_form(const LinkedObjectFile& file) const { + std::string load_operator; + switch (kind) { + case FLOAT: + load_operator = "l.f"; + break; + case UNSIGNED: + switch (size) { + case 1: + load_operator = "l.bu"; + break; + case 2: + load_operator = "l.hu"; + break; + case 4: + load_operator = "l.wu"; + break; + case 8: + load_operator = "l.d"; + break; + case 16: + load_operator = "l.q"; + break; + default: + assert(false); + } + break; + case SIGNED: + switch (size) { + case 1: + load_operator = "l.bs"; + break; + case 2: + load_operator = "l.hs"; + break; + case 4: + load_operator = "l.ws"; + break; + default: + assert(false); + } + break; + default: + assert(false); + } + return buildList(toForm(load_operator), location->to_form(file)); +} + +std::shared_ptr IR_FloatMath2::to_form(const LinkedObjectFile& file) const { + std::string math_operator; + switch (kind) { + case DIV: + math_operator = "/.f"; + break; + case MUL: + math_operator = "*.f"; + break; + case ADD: + math_operator = "+.f"; + break; + case SUB: + math_operator = "-.f"; + break; + case MIN: + math_operator = "min.f"; + break; + case MAX: + math_operator = "max.f"; + break; + default: + assert(false); + } + + return buildList(toForm(math_operator), arg0->to_form(file), arg1->to_form(file)); +} + +std::shared_ptr IR_IntMath2::to_form(const LinkedObjectFile& file) const { + std::string math_operator; + switch (kind) { + case ADD: + math_operator = "+.i"; + break; + case SUB: + math_operator = "-.i"; + break; + case MUL_SIGNED: + math_operator = "*.si"; + break; + case MUL_UNSIGNED: + math_operator = "*.ui"; + break; + case DIV_SIGNED: + math_operator = "/.si"; + break; + case MOD_SIGNED: + math_operator = "mod.si"; + break; + case DIV_UNSIGNED: + math_operator = "/.ui"; + break; + case MOD_UNSIGNED: + math_operator = "mod.ui"; + break; + case OR: + math_operator = "logior"; + break; + case AND: + math_operator = "logand"; + break; + case NOR: + math_operator = "lognor"; + break; + case XOR: + math_operator = "logxor"; + break; + case LEFT_SHIFT: + math_operator = "shl"; + break; + case RIGHT_SHIFT_ARITH: + math_operator = "sar"; + break; + case RIGHT_SHIFT_LOGIC: + math_operator = "shr"; + break; + default: + assert(false); + } + return buildList(toForm(math_operator), arg0->to_form(file), arg1->to_form(file)); +} + +std::shared_ptr IR_IntMath1::to_form(const LinkedObjectFile& file) const { + std::string math_operator; + switch (kind) { + case NOT: + math_operator = "lognot"; + break; + default: + assert(false); + } + return buildList(toForm(math_operator), arg->to_form(file)); +} + +std::shared_ptr IR_FloatMath1::to_form(const LinkedObjectFile& file) const { + std::string math_operator; + switch (kind) { + case FLOAT_TO_INT: + math_operator = "int<-float"; + break; + case INT_TO_FLOAT: + math_operator = "float<-int"; + break; + case ABS: + math_operator = "abs.f"; + break; + case NEG: + math_operator = "neg.f"; + break; + case SQRT: + math_operator = "sqrt.f"; + break; + default: + assert(false); + } + return buildList(toForm(math_operator), arg->to_form(file)); +} + +std::shared_ptr IR_Call::to_form(const LinkedObjectFile& file) const { + (void)file; + return buildList("call!"); +} + +std::shared_ptr IR_IntegerConstant::to_form(const LinkedObjectFile& file) const { + (void)file; + return toForm(std::to_string(value)); +} + +std::shared_ptr BranchDelay::to_form(const LinkedObjectFile& file) const { + (void)file; + switch (kind) { + case NOP: + return buildList("nop"); + case SET_REG_FALSE: + return buildList(toForm("set!"), destination->to_form(file), "'#f"); + case SET_REG_TRUE: + return buildList(toForm("set!"), destination->to_form(file), "'#t"); + case SET_REG_REG: + return buildList(toForm("set!"), destination->to_form(file), source->to_form(file)); + case UNKNOWN: + return buildList("unknown-branch-delay"); + default: + assert(false); + } +} + +std::shared_ptr IR_Nop::to_form(const LinkedObjectFile& file) const { + (void)file; + return buildList("nop!"); +} + +int Condition::num_args() const { + switch (kind) { + case NOT_EQUAL: + case EQUAL: + case LESS_THAN_SIGNED: + case LESS_THAN_UNSIGNED: + case GREATER_THAN_SIGNED: + case GREATER_THAN_UNSIGNED: + case LEQ_SIGNED: + case GEQ_SIGNED: + case LEQ_UNSIGNED: + case GEQ_UNSIGNED: + case FLOAT_EQUAL: + case FLOAT_NOT_EQUAL: + case FLOAT_LESS_THAN: + case FLOAT_GEQ: + return 2; + case ZERO: + case NONZERO: + case FALSE: + case TRUTHY: + return 1; + case ALWAYS: + return 0; + default: + assert(false); + } +} + +std::shared_ptr Condition::to_form(const LinkedObjectFile& file) const { + int nargs = num_args(); + std::string condtion_operator; + switch (kind) { + case NOT_EQUAL: + condtion_operator = "!="; + break; + case EQUAL: + condtion_operator = "="; + break; + case LESS_THAN_SIGNED: + condtion_operator = "<.si"; + break; + case LESS_THAN_UNSIGNED: + condtion_operator = "<.ui"; + break; + case GREATER_THAN_SIGNED: + condtion_operator = ">.si"; + break; + case GREATER_THAN_UNSIGNED: + condtion_operator = ">.ui"; + break; + case LEQ_SIGNED: + condtion_operator = "<=.si"; + break; + case GEQ_SIGNED: + condtion_operator = ">=.si"; + break; + case LEQ_UNSIGNED: + condtion_operator = "<=.ui"; + break; + case GEQ_UNSIGNED: + condtion_operator = ">=.ui"; + break; + case ZERO: + condtion_operator = "zero?"; + break; + case NONZERO: + condtion_operator = "nonzero?"; + break; + case FALSE: + condtion_operator = "not"; + break; + case TRUTHY: + condtion_operator = ""; + break; + case ALWAYS: + condtion_operator = "'#t"; + break; + case FLOAT_EQUAL: + condtion_operator = "=.f"; + break; + case FLOAT_NOT_EQUAL: + condtion_operator = "!=.f"; + break; + case FLOAT_LESS_THAN: + condtion_operator = "<.f"; + break; + case FLOAT_GEQ: + condtion_operator = ">=.f"; + break; + default: + assert(false); + } + + if (nargs == 2) { + return buildList(toForm(condtion_operator), src0->to_form(file), src1->to_form(file)); + } else if (nargs == 1) { + if (condtion_operator.empty()) { + return src0->to_form(file); + } else { + return buildList(toForm(condtion_operator), src0->to_form(file)); + } + } else if (nargs == 0) { + return toForm(condtion_operator); + } else { + assert(false); + } +} + +std::shared_ptr IR_Branch::to_form(const LinkedObjectFile& file) const { + return buildList(toForm(likely ? "bl!" : "b!"), condition.to_form(file), + toForm(file.get_label_name(dest_label_idx)), branch_delay.to_form(file)); +} + +std::shared_ptr IR_Compare::to_form(const LinkedObjectFile& file) const { + return condition.to_form(file); +} + +std::shared_ptr IR_Suspend::to_form(const LinkedObjectFile& file) const { + (void)file; + return buildList("suspend!"); +} \ No newline at end of file diff --git a/decompiler/IR/IR.h b/decompiler/IR/IR.h new file mode 100644 index 0000000000..e347afe9b5 --- /dev/null +++ b/decompiler/IR/IR.h @@ -0,0 +1,243 @@ +#ifndef JAK_IR_H +#define JAK_IR_H + +#include +#include "decompiler/Disasm/Register.h" +#include "decompiler/util/LispPrint.h" + +class LinkedObjectFile; + +class IR { + public: + virtual std::shared_ptr to_form(const LinkedObjectFile& file) const = 0; + std::string print(const LinkedObjectFile& file) const; + + bool is_basic_op = false; +}; + +class IR_Failed : public IR { + public: + IR_Failed() = default; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_Register : public IR { + public: + IR_Register(Register _reg, int _instr_idx) : reg(_reg), instr_idx(_instr_idx) {} + std::shared_ptr to_form(const LinkedObjectFile& file) const override; + Register reg; + int instr_idx = -1; +}; + +class IR_Set : public IR { + public: + enum Kind { + REG_64, + LOAD, + STORE, + SYM_LOAD, + SYM_STORE, + FPR_TO_GPR64, + GPR_TO_FPR, + REG_FLT, + REG_I128 + } kind; + IR_Set(Kind _kind, std::shared_ptr _dst, std::shared_ptr _src) + : kind(_kind), dst(std::move(_dst)), src(std::move(_src)) {} + std::shared_ptr to_form(const LinkedObjectFile& file) const override; + std::shared_ptr dst, src; + std::shared_ptr clobber = nullptr; +}; + +class IR_Store : public IR_Set { + public: + enum Kind { INTEGER, FLOAT } kind; + IR_Store(Kind _kind, std::shared_ptr _dst, std::shared_ptr _src, int _size) + : IR_Set(IR_Set::LOAD, std::move(_dst), std::move(_src)), kind(_kind), size(_size) {} + int size; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_Symbol : public IR { + public: + IR_Symbol(std::string _name) : name(std::move(_name)) {} + std::string name; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_SymbolValue : public IR { + public: + IR_SymbolValue(std::string _name) : name(std::move(_name)) {} + std::string name; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_StaticAddress : public IR { + public: + IR_StaticAddress(int _label_id) : label_id(_label_id) {} + int label_id = -1; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_Load : public IR { + public: + enum Kind { UNSIGNED, SIGNED, FLOAT } kind; + + IR_Load(Kind _kind, int _size, const std::shared_ptr& _location) + : kind(_kind), size(_size), location(_location) {} + int size; + std::shared_ptr location; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_FloatMath2 : public IR { + public: + enum Kind { DIV, MUL, ADD, SUB, MIN, MAX } kind; + IR_FloatMath2(Kind _kind, std::shared_ptr _arg0, std::shared_ptr _arg1) + : kind(_kind), arg0(std::move(_arg0)), arg1(std::move(_arg1)) {} + std::shared_ptr arg0, arg1; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_FloatMath1 : public IR { + public: + enum Kind { FLOAT_TO_INT, INT_TO_FLOAT, ABS, NEG, SQRT } kind; + IR_FloatMath1(Kind _kind, std::shared_ptr _arg) : kind(_kind), arg(std::move(_arg)) {} + std::shared_ptr arg; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_IntMath2 : public IR { + public: + enum Kind { + ADD, + SUB, + MUL_SIGNED, + DIV_SIGNED, + MOD_SIGNED, + DIV_UNSIGNED, + MOD_UNSIGNED, + OR, + AND, + NOR, + XOR, + LEFT_SHIFT, + RIGHT_SHIFT_ARITH, + RIGHT_SHIFT_LOGIC, + MUL_UNSIGNED + } kind; + IR_IntMath2(Kind _kind, std::shared_ptr _arg0, std::shared_ptr _arg1) + : kind(_kind), arg0(std::move(_arg0)), arg1(std::move(_arg1)) {} + std::shared_ptr arg0, arg1; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_IntMath1 : public IR { + public: + enum Kind { NOT } kind; + IR_IntMath1(Kind _kind, std::shared_ptr _arg) : kind(_kind), arg(std::move(_arg)) {} + std::shared_ptr arg; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_Call : public IR { + public: + IR_Call() = default; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_IntegerConstant : public IR { + public: + int64_t value; + explicit IR_IntegerConstant(int64_t _value) : value(_value) {} + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +struct BranchDelay { + enum Kind { NOP, SET_REG_FALSE, SET_REG_TRUE, SET_REG_REG, UNKNOWN } kind; + std::shared_ptr destination = nullptr, source = nullptr; + BranchDelay(Kind _kind) : kind(_kind) {} + std::shared_ptr to_form(const LinkedObjectFile& file) const; +}; + +struct Condition { + enum Kind { + NOT_EQUAL, + EQUAL, + LESS_THAN_SIGNED, + GREATER_THAN_SIGNED, + LEQ_SIGNED, + GEQ_SIGNED, + LESS_THAN_UNSIGNED, + GREATER_THAN_UNSIGNED, + LEQ_UNSIGNED, + GEQ_UNSIGNED, + ZERO, + NONZERO, + FALSE, + TRUTHY, + ALWAYS, + FLOAT_EQUAL, + FLOAT_NOT_EQUAL, + FLOAT_LESS_THAN, + FLOAT_GEQ + } kind; + + Condition(Kind _kind, + std::shared_ptr _src0, + std::shared_ptr _src1, + std::shared_ptr _clobber) + : kind(_kind), src0(std::move(_src0)), src1(std::move(_src1)), clobber(std::move(_clobber)) { + int nargs = num_args(); + if (nargs == 2) { + assert(src0 && src1); + } else if (nargs == 1) { + assert(src0 && !src1); + } else if (nargs == 0) { + assert(!src0 && !src1); + } + } + + int num_args() const; + std::shared_ptr to_form(const LinkedObjectFile& file) const; + std::shared_ptr src0, src1, clobber; +}; + +class IR_Branch : public IR { + public: + IR_Branch(Condition _condition, int _dest_label_idx, BranchDelay _branch_delay, bool _likely) + : condition(std::move(_condition)), + dest_label_idx(_dest_label_idx), + branch_delay(std::move(_branch_delay)), + likely(_likely) {} + + Condition condition; + int dest_label_idx; + BranchDelay branch_delay; + bool likely; + + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_Compare : public IR { + public: + explicit IR_Compare(Condition _condition) : condition(std::move(_condition)) {} + + Condition condition; + + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_Nop : public IR { + public: + IR_Nop() = default; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +class IR_Suspend : public IR { + public: + IR_Suspend() = default; + std::shared_ptr to_form(const LinkedObjectFile& file) const override; +}; + +#endif // JAK_IR_H diff --git a/decompiler/ObjectFile/LinkedObjectFile.cpp b/decompiler/ObjectFile/LinkedObjectFile.cpp index be9eaa1de7..6f4249bd7f 100644 --- a/decompiler/ObjectFile/LinkedObjectFile.cpp +++ b/decompiler/ObjectFile/LinkedObjectFile.cpp @@ -483,6 +483,8 @@ void LinkedObjectFile::process_fp_relative_links() { if (pprev_instr && pprev_instr->kind == InstructionKind::LUI) { assert(pprev_instr->get_dst(0).get_reg() == offset_reg); additional_offset = (1 << 16) * pprev_instr->get_imm_src().get_imm(); + pprev_instr->get_imm_src().set_label( + get_label_id_for(seg, current_fp + atom.get_imm() + additional_offset)); } atom.set_label( get_label_id_for(seg, current_fp + atom.get_imm() + additional_offset)); @@ -554,6 +556,12 @@ std::string LinkedObjectFile::print_disassembly() { auto& word = words_by_seg[seg].at(func.start_word + i); append_word_to_string(result, word); } else { + if (func.has_basic_ops() && func.instr_starts_basic_op(i)) { + if (line.length() < 40) { + line.append(40 - line.length(), ' '); + } + line += ";; " + func.get_basic_op_at_instr(i)->print(*this); + } result += line + "\n"; } diff --git a/decompiler/ObjectFile/LinkedObjectFileCreation.cpp b/decompiler/ObjectFile/LinkedObjectFileCreation.cpp index 91cfa2b19f..936aefeb0b 100644 --- a/decompiler/ObjectFile/LinkedObjectFileCreation.cpp +++ b/decompiler/ObjectFile/LinkedObjectFileCreation.cpp @@ -8,7 +8,7 @@ #include #include "LinkedObjectFileCreation.h" #include "decompiler/config.h" -#include "decompiler/TypeSystem/TypeInfo.h" +#include "decompiler/util/DecompilerTypeSystem.h" // There are three link versions: // V2 - not really in use anymore, but V4 will resue logic from it (and the game didn't rename the @@ -86,8 +86,9 @@ static uint32_t c_symlink2(LinkedObjectFile& f, uint32_t link_ptr_offset, SymbolLinkKind kind, const char* name, - int seg_id) { - get_type_info().inform_symbol_with_no_type_info(name); + int seg_id, + DecompilerTypeSystem& dts) { + dts.add_symbol(name); auto initial_offset = code_ptr_offset; do { auto table_value = data.at(link_ptr_offset); @@ -130,7 +131,7 @@ static uint32_t c_symlink2(LinkedObjectFile& f, word_kind = LinkedWord::EMPTY_PTR; break; case SymbolLinkKind::TYPE: - get_type_info().inform_type(name); + dts.add_symbol(name, "type"); word_kind = LinkedWord::TYPE_PTR; break; default: @@ -162,8 +163,9 @@ static uint32_t c_symlink3(LinkedObjectFile& f, uint32_t link_ptr, SymbolLinkKind kind, const char* name, - int seg) { - get_type_info().inform_symbol_with_no_type_info(name); + int seg, + DecompilerTypeSystem& dts) { + dts.add_symbol(name); auto initial_offset = code_ptr; do { // seek, with a variable length encoding that sucks. @@ -187,7 +189,7 @@ static uint32_t c_symlink3(LinkedObjectFile& f, word_kind = LinkedWord::EMPTY_PTR; break; case SymbolLinkKind::TYPE: - get_type_info().inform_type(name); + dts.add_symbol(name, "type"); word_kind = LinkedWord::TYPE_PTR; break; default: @@ -223,7 +225,8 @@ static uint32_t align16(uint32_t in) { */ static void link_v4(LinkedObjectFile& f, const std::vector& data, - const std::string& name) { + const std::string& name, + DecompilerTypeSystem& dts) { // read the V4 header to find where the link data really is const auto* header = (const LinkHeaderV4*)&data.at(0); uint32_t link_data_offset = header->code_size + sizeof(LinkHeaderV4); // no basic offset @@ -358,7 +361,7 @@ static void link_v4(LinkedObjectFile& f, link_ptr_offset += strlen(s_name) + 1; f.stats.total_v2_symbol_count++; - link_ptr_offset = c_symlink2(f, data, code_offset, link_ptr_offset, kind, s_name, 0); + link_ptr_offset = c_symlink2(f, data, code_offset, link_ptr_offset, kind, s_name, 0, dts); if (data.at(link_ptr_offset) == 0) break; } @@ -384,7 +387,8 @@ static void assert_string_empty_after(const char* str, int size) { static void link_v5(LinkedObjectFile& f, const std::vector& data, - const std::string& name) { + const std::string& name, + DecompilerTypeSystem& dts) { auto header = (const LinkHeaderV5*)(&data.at(0)); if (header->n_segments == 1) { printf("abandon %s!\n", name.c_str()); @@ -539,10 +543,10 @@ static void link_v5(LinkedObjectFile& f, if (std::string("_empty_") == sname) { link_ptr = c_symlink2(f, data, segment_data_offsets[seg_id], link_ptr, - SymbolLinkKind::EMPTY_LIST, sname, seg_id); + SymbolLinkKind::EMPTY_LIST, sname, seg_id, dts); } else { link_ptr = c_symlink2(f, data, segment_data_offsets[seg_id], link_ptr, - SymbolLinkKind::SYMBOL, sname, seg_id); + SymbolLinkKind::SYMBOL, sname, seg_id, dts); } } else if ((reloc & 0x3f) == 0x3f) { assert(false); // todo, does this ever get hit? @@ -556,7 +560,7 @@ static void link_v5(LinkedObjectFile& f, const char* sname = (const char*)(&data.at(link_ptr)); link_ptr += strlen(sname) + 1; link_ptr = c_symlink2(f, data, segment_data_offsets[seg_id], link_ptr, - SymbolLinkKind::TYPE, sname, seg_id); + SymbolLinkKind::TYPE, sname, seg_id, dts); } sub_link_ptr = link_ptr; @@ -586,7 +590,8 @@ static void link_v5(LinkedObjectFile& f, static void link_v3(LinkedObjectFile& f, const std::vector& data, - const std::string& name) { + const std::string& name, + DecompilerTypeSystem& dts) { auto header = (const LinkHeaderV3*)(&data.at(0)); assert(name == header->name); assert(header->segments == 3); @@ -739,7 +744,7 @@ static void link_v3(LinkedObjectFile& f, // methods todo s_name = (const char*)(&data.at(link_ptr)); - get_type_info().inform_type_method_count(s_name, reloc & 0x7f); + // get_type_info().inform_type_method_count(s_name, reloc & 0x7f); todo kind = SymbolLinkKind::TYPE; } @@ -750,7 +755,7 @@ static void link_v3(LinkedObjectFile& f, link_ptr += strlen(s_name) + 1; f.stats.v3_symbol_count++; - link_ptr = c_symlink3(f, data, base_ptr, link_ptr, kind, s_name, seg_id); + link_ptr = c_symlink3(f, data, base_ptr, link_ptr, kind, s_name, seg_id, dts); } segment_link_ends[seg_id] = link_ptr; } @@ -775,19 +780,21 @@ static void link_v3(LinkedObjectFile& f, /*! * Main function to generate LinkedObjectFiles from raw object data. */ -LinkedObjectFile to_linked_object_file(const std::vector& data, const std::string& name) { +LinkedObjectFile to_linked_object_file(const std::vector& data, + const std::string& name, + DecompilerTypeSystem& dts) { LinkedObjectFile result; const auto* header = (const LinkHeaderCommon*)&data.at(0); // use appropriate linker if (header->version == 3) { assert(header->type_tag == 0); - link_v3(result, data, name); + link_v3(result, data, name, dts); } else if (header->version == 4) { assert(header->type_tag == 0xffffffff); - link_v4(result, data, name); + link_v4(result, data, name, dts); } else if (header->version == 5) { - link_v5(result, data, name); + link_v5(result, data, name, dts); } else { assert(false); } diff --git a/decompiler/ObjectFile/LinkedObjectFileCreation.h b/decompiler/ObjectFile/LinkedObjectFileCreation.h index 7faf3b602c..fde133275f 100644 --- a/decompiler/ObjectFile/LinkedObjectFileCreation.h +++ b/decompiler/ObjectFile/LinkedObjectFileCreation.h @@ -11,6 +11,9 @@ #include "LinkedObjectFile.h" -LinkedObjectFile to_linked_object_file(const std::vector& data, const std::string& name); +class DecompilerTypeSystem; +LinkedObjectFile to_linked_object_file(const std::vector& data, + const std::string& name, + DecompilerTypeSystem& dts); #endif // NEXT_LINKEDOBJECTFILECREATION_H diff --git a/decompiler/ObjectFile/ObjectFileDB.cpp b/decompiler/ObjectFile/ObjectFileDB.cpp index ec6bcfc700..8bdcb184e4 100644 --- a/decompiler/ObjectFile/ObjectFileDB.cpp +++ b/decompiler/ObjectFile/ObjectFileDB.cpp @@ -18,6 +18,7 @@ #include "common/util/Timer.h" #include "common/util/FileUtil.h" #include "decompiler/Function/BasicBlocks.h" +#include "decompiler/IR/BasicOpBuilder.h" /*! * Get a unique name for this object file. @@ -64,6 +65,8 @@ ObjectFileData& ObjectFileDB::lookup_record(ObjectFileRecord rec) { */ ObjectFileDB::ObjectFileDB(const std::vector& _dgos) { Timer timer; + printf("- Loading Types...\n"); + dts.parse_type_defs({"decompiler", "config", "all-types.gc"}); printf("- Initializing ObjectFileDB...\n"); for (auto& dgo : _dgos) { @@ -71,7 +74,7 @@ ObjectFileDB::ObjectFileDB(const std::vector& _dgos) { } printf("ObjectFileDB Initialized:\n"); - printf(" total dgos: %lld\n", _dgos.size()); + printf(" total dgos: %d\n", int(_dgos.size())); printf(" total data: %d bytes\n", stats.total_dgo_bytes); printf(" total objs: %d\n", stats.total_obj_files); printf(" unique objs: %d\n", stats.unique_obj_files); @@ -356,7 +359,7 @@ void ObjectFileDB::process_link_data() { LinkedObjectFile::Stats combined_stats; for_each_obj([&](ObjectFileData& obj) { - obj.linked_data = to_linked_object_file(obj.data, obj.record.name); + obj.linked_data = to_linked_object_file(obj.data, obj.record.name, dts); combined_stats.add(obj.linked_data.stats); }); @@ -543,7 +546,7 @@ void ObjectFileDB::analyze_functions() { auto& func = data.linked_data.functions_by_seg.at(2).front(); assert(func.guessed_name.empty()); func.guessed_name.set_as_top_level(); - func.find_global_function_defs(data.linked_data); + func.find_global_function_defs(data.linked_data, dts); func.find_method_defs(data.linked_data); } }); @@ -591,6 +594,8 @@ void ObjectFileDB::analyze_functions() { int total_nontrivial_functions = 0; int total_resolved_nontrivial_functions = 0; int total_named_functions = 0; + int total_basic_ops = 0; + int total_failed_basic_ops = 0; std::map> unresolved_by_length; if (get_config().find_basic_blocks) { @@ -601,10 +606,18 @@ void ObjectFileDB::analyze_functions() { total_basic_blocks += blocks.size(); func.basic_blocks = blocks; + total_functions++; if (!func.suspected_asm) { func.analyze_prologue(data.linked_data); func.cfg = build_cfg(data.linked_data, segment_id, func); - total_functions++; + for (auto& block : func.basic_blocks) { + if (block.end_word > block.start_word) { + add_basic_ops_to_block(&func, block, &data.linked_data); + } + } + total_basic_ops += func.get_basic_op_count(); + total_failed_basic_ops += func.get_failed_basic_op_count(); + if (func.cfg->is_fully_resolved()) { resolved_cfg_functions++; } @@ -640,11 +653,15 @@ void ObjectFileDB::analyze_functions() { total_nontrivial_functions, 100.f * float(total_resolved_nontrivial_functions) / float(total_nontrivial_functions)); - for (auto& kv : unresolved_by_length) { - printf("LEN %d\n", kv.first); - for (auto& x : kv.second) { - printf(" %s\n", x.c_str()); - } - } + int successful_basic_ops = total_basic_ops - total_failed_basic_ops; + printf(" %d/%d basic ops converted successfully (%.2f%%)\n", successful_basic_ops, + total_basic_ops, 100.f * float(successful_basic_ops) / float(total_basic_ops)); + + // for (auto& kv : unresolved_by_length) { + // printf("LEN %d\n", kv.first); + // for (auto& x : kv.second) { + // printf(" %s\n", x.c_str()); + // } + // } } } diff --git a/decompiler/ObjectFile/ObjectFileDB.h b/decompiler/ObjectFile/ObjectFileDB.h index 286005e93d..b9d8915f6f 100644 --- a/decompiler/ObjectFile/ObjectFileDB.h +++ b/decompiler/ObjectFile/ObjectFileDB.h @@ -15,6 +15,7 @@ #include #include #include "LinkedObjectFile.h" +#include "decompiler/util/DecompilerTypeSystem.h" /*! * A "record" which can be used to identify an object file. @@ -55,6 +56,7 @@ class ObjectFileDB { void write_disassembly(const std::string& output_dir, bool disassemble_objects_without_functions); void analyze_functions(); ObjectFileData& lookup_record(ObjectFileRecord rec); + DecompilerTypeSystem dts; private: void get_objs_from_dgo(const std::string& filename); diff --git a/decompiler/TypeSystem/GoalFunction.cpp b/decompiler/TypeSystem/GoalFunction.cpp deleted file mode 100644 index f27ac3fbcf..0000000000 --- a/decompiler/TypeSystem/GoalFunction.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "GoalFunction.h" diff --git a/decompiler/TypeSystem/GoalFunction.h b/decompiler/TypeSystem/GoalFunction.h deleted file mode 100644 index c682ebc593..0000000000 --- a/decompiler/TypeSystem/GoalFunction.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#ifndef JAK_DISASSEMBLER_GOALFUNCTION_H -#define JAK_DISASSEMBLER_GOALFUNCTION_H - -class GoalFunction { - public: - // enum Kind { - // GLOBAL_FUNCTION, - // ANON_FUNCTION, - // METHOD, - // BEHAVIOR, - // UNKNOWN - // }; -}; - -#endif // JAK_DISASSEMBLER_GOALFUNCTION_H diff --git a/decompiler/TypeSystem/GoalSymbol.cpp b/decompiler/TypeSystem/GoalSymbol.cpp deleted file mode 100644 index f60dc6d825..0000000000 --- a/decompiler/TypeSystem/GoalSymbol.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "GoalSymbol.h" diff --git a/decompiler/TypeSystem/GoalSymbol.h b/decompiler/TypeSystem/GoalSymbol.h deleted file mode 100644 index 5def7a1830..0000000000 --- a/decompiler/TypeSystem/GoalSymbol.h +++ /dev/null @@ -1,39 +0,0 @@ -#pragma once - -#ifndef JAK_DISASSEMBLER_GOALSYMBOL_H -#define JAK_DISASSEMBLER_GOALSYMBOL_H - -#include -#include -#include "TypeSpec.h" - -class GoalSymbol { - public: - GoalSymbol() = default; - explicit GoalSymbol(std::string name) : m_name(std::move(name)) {} - GoalSymbol(std::string name, TypeSpec ts) : m_name(std::move(name)), m_type(std::move(ts)) { - m_has_type_info = true; - } - - bool has_type_info() const { return m_has_type_info; } - - void set_type(TypeSpec ts) { - if (m_has_type_info) { - if (ts != m_type) { - printf("symbol %s %s -> %s", m_name.c_str(), m_type.to_string().c_str(), - ts.to_string().c_str()); - assert(false); - } - } - - m_has_type_info = true; - m_type = std::move(ts); - } - - private: - std::string m_name; - TypeSpec m_type; - bool m_has_type_info = false; -}; - -#endif // JAK_DISASSEMBLER_GOALSYMBOL_H diff --git a/decompiler/TypeSystem/GoalType.cpp b/decompiler/TypeSystem/GoalType.cpp deleted file mode 100644 index b0287dfcb7..0000000000 --- a/decompiler/TypeSystem/GoalType.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "GoalType.h" - -void GoalType::set_methods(int n) { - if (m_method_count_set) { - if (m_method_count != n) { - printf("Type %s had %d methods, set_methods tried to change it to %d\n", m_name.c_str(), - m_method_count, n); - } - } else { - m_method_count = n; - m_method_count_set = true; - } -} \ No newline at end of file diff --git a/decompiler/TypeSystem/GoalType.h b/decompiler/TypeSystem/GoalType.h deleted file mode 100644 index 56853fcbef..0000000000 --- a/decompiler/TypeSystem/GoalType.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#ifndef JAK_DISASSEMBLER_GOALTYPE_H -#define JAK_DISASSEMBLER_GOALTYPE_H - -#include - -class GoalType { - public: - GoalType() = default; - GoalType(std::string name) : m_name(std::move(name)) {} - bool has_info() const { return m_has_info; } - - bool has_method_count() const { return m_method_count_set; } - - void set_methods(int n); - - private: - std::string m_name; - bool m_has_info = false; - bool m_method_count_set = false; - int m_method_count = -1; -}; - -#endif // JAK_DISASSEMBLER_GOALTYPE_H diff --git a/decompiler/TypeSystem/TypeInfo.cpp b/decompiler/TypeSystem/TypeInfo.cpp deleted file mode 100644 index db8e4127fd..0000000000 --- a/decompiler/TypeSystem/TypeInfo.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include "TypeInfo.h" - -#include - -namespace { -TypeInfo gTypeInfo; -} - -TypeInfo::TypeInfo() { - GoalType type_type("type"); - m_types["type"] = type_type; - GoalSymbol type_symbol("type"); - m_symbols["type"] = type_symbol; -} - -TypeInfo& get_type_info() { - return gTypeInfo; -} - -std::string TypeInfo::get_summary() { - int total_symbols = 0; - int syms_with_type_info = 0; - for (const auto& kv : m_symbols) { - total_symbols++; - if (kv.second.has_type_info()) { - syms_with_type_info++; - } - } - - int total_types = 0; - int types_with_info = 0; - int types_with_method_count = 0; - for (const auto& kv : m_types) { - total_types++; - if (kv.second.has_info()) { - types_with_info++; - } - if (kv.second.has_method_count()) { - types_with_method_count++; - } - } - - char buffer[1024]; - sprintf(buffer, - "TypeInfo Summary\n" - " Total Symbols: %d\n" - " with type info: %d (%.2f%%)\n" - " Total Types: %d\n" - " with info: %d (%.2f%%)\n" - " with method count: %d (%.2f%%)\n", - total_symbols, syms_with_type_info, - 100.f * float(syms_with_type_info) / float(total_symbols), total_types, types_with_info, - 100.f * float(types_with_info) / float(total_types), types_with_method_count, - 100.f * float(types_with_method_count) / float(total_types)); - - return {buffer}; -} - -/*! - * inform TypeInfo that there is a symbol with this name. - * Provides no type info - if some is already known there is no change. - */ -void TypeInfo::inform_symbol_with_no_type_info(const std::string& name) { - if (m_symbols.find(name) == m_symbols.end()) { - // only add it if we haven't seen this already. - GoalSymbol sym(name); - m_symbols[name] = sym; - } -} - -void TypeInfo::inform_symbol(const std::string& name, TypeSpec type) { - inform_symbol_with_no_type_info(name); - m_symbols.at(name).set_type(std::move(type)); -} - -void TypeInfo::inform_type(const std::string& name) { - if (m_types.find(name) == m_types.end()) { - GoalType typ(name); - m_types[name] = typ; - } - inform_symbol(name, TypeSpec("type")); -} - -void TypeInfo::inform_type_method_count(const std::string& name, int methods) { - // create type and symbol - inform_type(name); - m_types.at(name).set_methods(methods); -} - -std::string TypeInfo::get_all_symbols_debug() { - std::string result = "const char* all_syms[" + std::to_string(m_symbols.size()) + "] = {"; - for (auto& x : m_symbols) { - result += "\"" + x.first + "\","; - } - if (!result.empty()) { - result.pop_back(); - } - return result + "};"; -} \ No newline at end of file diff --git a/decompiler/TypeSystem/TypeInfo.h b/decompiler/TypeSystem/TypeInfo.h deleted file mode 100644 index 3c67bae707..0000000000 --- a/decompiler/TypeSystem/TypeInfo.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#ifndef JAK_DISASSEMBLER_TYPEINFO_H -#define JAK_DISASSEMBLER_TYPEINFO_H - -#include -#include "GoalType.h" -#include "GoalFunction.h" -#include "GoalSymbol.h" - -class TypeInfo { - public: - TypeInfo(); - - void inform_symbol(const std::string& name, TypeSpec type); - void inform_symbol_with_no_type_info(const std::string& name); - void inform_type(const std::string& name); - void inform_type_method_count(const std::string& name, int methods); - - std::string get_summary(); - std::string get_all_symbols_debug(); - - private: - std::unordered_map m_types; - std::unordered_map m_global_functions; - std::unordered_map m_symbols; -}; - -TypeInfo& get_type_info(); -void init_type_info(); - -#endif // JAK_DISASSEMBLER_TYPEINFO_H diff --git a/decompiler/TypeSystem/TypeSpec.cpp b/decompiler/TypeSystem/TypeSpec.cpp deleted file mode 100644 index 660f767ff5..0000000000 --- a/decompiler/TypeSystem/TypeSpec.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "TypeSpec.h" - -std::string TypeSpec::to_string() const { - if (m_args.empty()) { - return m_base_type; - } else { - std::string result = "("; - result += m_base_type; - for (const auto& x : m_args) { - result += " "; - result += x.to_string(); - } - result += ")"; - return result; - } -} - -std::shared_ptr TypeSpec::to_form() const { - if (m_args.empty()) { - return toForm(m_base_type); - } else { - std::vector> all; - all.push_back(toForm(m_base_type)); - for (const auto& x : m_args) { - all.push_back(x.to_form()); - } - return buildList(all); - } -} - -bool TypeSpec::operator==(const TypeSpec& other) const { - if (m_base_type != other.m_base_type) { - return false; - } - - if (m_args.size() != other.m_args.size()) { - return false; - } - - for (size_t i = 0; i < m_args.size(); i++) { - if (m_args[i] != other.m_args[i]) { - return false; - } - } - - return true; -} - -bool TypeSpec::operator!=(const TypeSpec& other) const { - return !(*this == other); -} diff --git a/decompiler/TypeSystem/TypeSpec.h b/decompiler/TypeSystem/TypeSpec.h deleted file mode 100644 index 3ce0afa5e6..0000000000 --- a/decompiler/TypeSystem/TypeSpec.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#ifndef JAK_DISASSEMBLER_TYPESPEC_H -#define JAK_DISASSEMBLER_TYPESPEC_H - -#include -#include -#include "decompiler/util/LispPrint.h" - -class TypeSpec { - public: - TypeSpec() = default; - explicit TypeSpec(std::string base_type) : m_base_type(std::move(base_type)) {} - TypeSpec(std::string base_type, std::vector args) - : m_base_type(std::move(base_type)), m_args(std::move(args)) {} - - std::string to_string() const; - std::shared_ptr to_form() const; - - bool operator==(const TypeSpec& other) const; - bool operator!=(const TypeSpec& other) const; - - private: - std::string m_base_type; - std::vector m_args; -}; - -#endif // JAK_DISASSEMBLER_TYPESPEC_H diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc new file mode 100644 index 0000000000..ba53994d70 --- /dev/null +++ b/decompiler/config/all-types.gc @@ -0,0 +1,7965 @@ +;; all-types.gc + +;; This contains all type information and should be compatible with both the compiler and decompiler + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TYPES +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(deftype bfloat (basic) + ((data float :offset-assert 4)) + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; SYMBOLS +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; GCOMMON +(define-extern identity (function object object)) +(define-extern + (function int int int)) + + +(define-extern function type) +(define-extern insert-cons! function) +(define-extern / function) +(define-extern 1/ function) +(define-extern lognot function) +(define-extern basic-type? function) +;;(define-extern pair object) ;; unknown type + +(define-extern qmem-copy->! function) +(define-extern mem-set32! function) +(define-extern delete-car! function) +(define-extern logxor function) +;;(define-extern inline-array-class object) ;; unknown type +(define-extern mem-print function) +;;(define-extern vec4s object) ;; unknown type +(define-extern array type) +(define-extern print-tree-bitmask function) +(define-extern logior function) +(define-extern quad-copy! function) +(define-extern assoc function) +(define-extern mem-or! function) +(define-extern fact function) +(define-extern max function) +(define-extern assoce function) +(define-extern mod function) +(define-extern false-func function) +(define-extern basic type) +(define-extern type-type? function) +(define-extern member function) +(define-extern nmember function) +(define-extern breakpoint-range-set! function) +(define-extern abs function) +(define-extern nassoc function) +;;(define-extern _format object) ;; unknown type +(define-extern logand function) +(define-extern find-parent-method function) +(define-extern true-func function) +(define-extern nassoce function) +(define-extern ref function) +;;(define-extern *print-column* object) ;; unknown type +(define-extern delete! function) +(define-extern qmem-copy<-! function) +(define-extern rem function) +(define-extern mem-copy! function) +(define-extern inspect function) +(define-extern type type) +;;(define-extern format object) ;; unknown type +;;(define-extern uint128 object) ;; unknown type +(define-extern append! function) +;;(define-extern *trace-list* object) ;; unknown type +(define-extern min function) +(define-extern last function) +(define-extern printl function) +(define-extern valid? function) +;;(define-extern nothing object) ;; unknown type +(define-extern ash function) +(define-extern lognor function) +(define-extern sort function) +;;(define-extern method-set! object) ;; unknown type +;;(define-extern *debug-segment* object) ;; unknown type +(define-extern bfloat type) +(define-extern * function) + +(define-extern print function) +(define-extern - function) +(define-extern string type) +;;(define-extern #t object) ;; unknown type +;;(define-extern integer object) ;; unknown type +(define-extern uint32 type) +(define-extern float type) +;;(define-extern uint16 object) ;; unknown type +(define-extern int32 type) +(define-extern uint8 type) +;;(define-extern int128 object) ;; unknown type +(define-extern symbol type) +(define-extern object type) +;;(define-extern uint64 object) ;; unknown type +;;(define-extern number object) ;; unknown type +(define-extern name= function) +;;(define-extern int64 object) ;; unknown type +;;(define-extern global object) ;; unknown type +;;(define-extern structure object) ;; unknown type +(define-extern int8 type) +;;(define-extern binteger object) ;; unknown type +;;(define-extern else object) ;; unknown type +(define-extern int16 type) + + +;;(define-extern stack-frame object) ;; unknown type +(define-extern state type) +;;(define-extern dead-pool-heap-rec object) ;; unknown type +;;(define-extern dead-pool object) ;; unknown type +;;(define-extern catch-frame object) ;; unknown type +;;(define-extern thread object) ;; unknown type +;;(define-extern handle object) ;; unknown type +;;(define-extern cpu-thread object) ;; unknown type +;;(define-extern dead-pool-heap object) ;; unknown type +(define-extern kernel-context type) +;;(define-extern protect-frame object) ;; unknown type +;;(define-extern event-message-block object) ;; unknown type +;;(define-extern process-tree object) ;; unknown type +;;(define-extern *listener-process* object) ;; unknown type +;;(define-extern *entity-pool* object) ;; unknown type +;;(define-extern *default-pool* object) ;; unknown type +(define-extern iterate-process-tree function) +;;(define-extern malloc object) ;; unknown type +;;(define-extern *deci-count* object) ;; unknown type +;;(define-extern ready object) ;; unknown type +;;(define-extern *camera-pool* object) ;; unknown type +(define-extern throw-dispatch function) +;;(define-extern game object) ;; unknown type +(define-extern run-function-in-process function) +(define-extern throw function) +;;(define-extern *nk-dead-pool* object) ;; unknown type +(define-extern kill-by-type function) +(define-extern search-process-tree function) +(define-extern change-to-last-brother function) +;;(define-extern *pickup-dead-pool* object) ;; unknown type +;;(define-extern *kernel-packages* object) ;; unknown type +;;(define-extern *camera-master-dead-pool* object) ;; unknown type +(define-extern load-package function) +(define-extern set-to-run function) +;;(define-extern *master-mode* object) ;; unknown type +;;(define-extern default-pool object) ;; unknown type +(define-extern return-from-thread-dead function) +;;(define-extern listener object) ;; unknown type +(define-extern process-count function) +;;(define-extern target-pool object) ;; unknown type +(define-extern set-to-run-bootstrap function) +(define-extern return-from-thread function) +;;(define-extern *camera-dead-pool* object) ;; unknown type +;;(define-extern *last-loado-debug-usage* object) ;; unknown type +;;(define-extern process object) ;; unknown type +(define-extern remove-exit function) +(define-extern previous-brother function) +(define-extern execute-process-tree function) +;;(define-extern dead-state object) ;; unknown type +;;(define-extern debug object) ;; unknown type +;;(define-extern *16k-dead-pool* object) ;; unknown type +(define-extern entity-deactivate-handler function) +;;(define-extern *null-process* object) ;; unknown type +(define-extern inspect-process-heap function) +(define-extern process-by-name function) +;;(define-extern *target-pool* object) ;; unknown type +;;(define-extern *global-search-name* object) ;; unknown type +;;(define-extern *kernel-boot-mode* object) ;; unknown type +;;(define-extern entity-pool object) ;; unknown type +(define-extern kill-not-type function) +;;(define-extern *kernel-context* object) ;; unknown type +;;(define-extern *kernel-boot-level* object) ;; unknown type +;;(define-extern main object) ;; unknown type +(define-extern change-brother function) +;;(define-extern *null-kernel-context* object) ;; unknown type +(define-extern kill-not-name function) +;;(define-extern *active-pool* object) ;; unknown type +;;(define-extern *dram-stack* object) ;; unknown type +;;(define-extern *irx-version* object) ;; unknown type +;;(define-extern *pause-lock* object) ;; unknown type +;;(define-extern display-pool object) ;; unknown type +(define-extern kill-by-name function) +;;(define-extern *target-dead-pool* object) ;; unknown type +;;(define-extern *vis-boot* object) ;; unknown type +;;(define-extern *debug-dead-pool* object) ;; unknown type +;;(define-extern *last-loado-length* object) ;; unknown type +;;(define-extern *4k-dead-pool* object) ;; unknown type +;;(define-extern *default-dead-pool* object) ;; unknown type +(define-extern kernel-dispatcher function) +;;(define-extern *8k-dead-pool* object) ;; unknown type +(define-extern unload-package function) +(define-extern reset-and-call function) +(define-extern process-not-name function) +;;(define-extern *display-pool* object) ;; unknown type +;;(define-extern *kernel-version* object) ;; unknown type +;;(define-extern active-pool object) ;; unknown type +;;(define-extern *dead-pool-list* object) ;; unknown type +;;(define-extern *global-search-count* object) ;; unknown type +;;(define-extern *last-loado-global-usage* object) ;; unknown type +(define-extern stream<-process-mask function) +(define-extern change-parent function) +(define-extern inspect-process-tree function) +;;(define-extern camera-pool object) ;; unknown type +;;(define-extern suspended object) ;; unknown type +;;(define-extern dgo-load object) ;; unknown type +;;(define-extern initialize-dead object) ;; unknown type +;;(define-extern #f object) ;; unknown type +;;(define-extern waiting-to-run object) ;; unknown type +;;(define-extern *stdcon0* object) ;; unknown type +;;(define-extern initialize-go object) ;; unknown type +;;(define-extern *stdcon* object) ;; unknown type +;;(define-extern trans object) ;; unknown type +;;(define-extern code object) ;; unknown type +;;(define-extern *listener-function* object) ;; unknown type +;;(define-extern *stdcon1* object) ;; unknown type +;;(define-extern initialize object) ;; unknown type +;;(define-extern *kernel-sp* object) ;; unknown type +(define-extern process-disconnect function) +;;(define-extern *debug-draw-pauseable* object) ;; unknown type +;;(define-extern _empty_ object) ;; unknown type +;;(define-extern running object) ;; unknown type +;;(define-extern *enable-method-set* object) ;; unknown type +;;(define-extern post object) ;; unknown type +;;(define-extern dead object) ;; unknown type +(define-extern install-default-debug-handler function) +(define-extern return-from-exception function) +;;(define-extern lowmemmap object) ;; unknown type +(define-extern kernel-write function) +(define-extern kernel-read function) +(define-extern deinstall-debug-handlers function) +(define-extern kernel-set-exception-vector function) +(define-extern kernel-copy-function function) +(define-extern kernel-check-hardwired-addresses function) +(define-extern kernel-set-level2-vector function) +(define-extern kernel-set-interrupt-vector function) +(define-extern kernel-read-function function) +(define-extern kernel-copy-to-kernel-ram function) +(define-extern kernel-write-function function) +(define-extern resend-exception function) +(define-extern deinstall-debug-handler function) +;;(define-extern install-debug-handler object) ;; unknown type +(define-extern copyn-string<-charp function) +(define-extern string<-charp function) +(define-extern string-get-arg!! function) +(define-extern string-get-float!! function) +(define-extern append-character-to-string function) +(define-extern string-get-int32!! function) +(define-extern charp-basename function) +(define-extern copy-charp<-charp function) +(define-extern string-skip-whitespace function) +(define-extern string-strip-whitespace! function) +(define-extern string=? function) +(define-extern string-charp= function) +(define-extern string->float function) +(define-extern cat-string<-string_to_charp function) +(define-extern string->int function) +(define-extern string<=? function) +(define-extern cat-string<-string function) +(define-extern clear function) +(define-extern string= function) +;;(define-extern *temp-string* object) ;; unknown type +(define-extern string-strip-leading-whitespace! function) +(define-extern catn-string<-charp function) +;;(define-extern *string-tmp-str* object) ;; unknown type +(define-extern string-suck-up! function) +(define-extern copy-string<-string function) +(define-extern string-skip-to-char function) +(define-extern string-strip-trailing-whitespace! function) +(define-extern string>? function) +(define-extern string-cat-to-last-char function) +;;(define-extern dgo-entry object) ;; unknown type +;;(define-extern dgo-file object) ;; unknown type +(define-extern enter-state function) +(define-extern send-event-function function) +(define-extern looping-code function) +(define-extern inherit-state function) +;;(define-extern time-frame object) ;; unknown type +;;(define-extern part-id object) ;; unknown type +(define-extern log2 function) +;;(define-extern xyzwh object) ;; unknown type +(define-extern rand-vu-init function) +(define-extern truncate function) +(define-extern rand-vu-nostep function) +(define-extern rand-vu function) +(define-extern lerp function) +(define-extern lerp-scale function) +(define-extern rand-vu-int-range function) +(define-extern lerp-clamp function) +;;(define-extern random-generator object) ;; unknown type +(define-extern integral? function) +(define-extern rand-uint31-gen function) +(define-extern rand-vu-int-count function) +(define-extern fractional-part function) +(define-extern seek function) +;;(define-extern xyzw object) ;; unknown type +(define-extern rand-vu-percent? function) +;;(define-extern *random-generator* object) ;; unknown type +(define-extern rand-vu-float-range function) +;;(define-extern rgba object) ;; unknown type +(define-extern seekl function) +;;(define-extern vector2h object) ;; unknown type +;;(define-extern vector4s-3 object) ;; unknown type +;;(define-extern *identity-vector* object) ;; unknown type +;;(define-extern vector4ub object) ;; unknown type +;;(define-extern vector2w object) ;; unknown type +;;(define-extern isphere object) ;; unknown type +(define-extern vector-dot-vu function) +;;(define-extern vertical-planes object) ;; unknown type +;;(define-extern cylinder object) ;; unknown type +;;(define-extern *x-vector* object) ;; unknown type +;;(define-extern *y-vector* object) ;; unknown type +;;(define-extern *z-vector* object) ;; unknown type +(define-extern vector-zero! function) +;;(define-extern bit-array object) ;; unknown type +(define-extern vector-! function) +;;(define-extern vector16b object) ;; unknown type +;;(define-extern vector-array object) ;; unknown type +;;(define-extern rgbaf object) ;; unknown type +;;(define-extern cylinder-flat object) ;; unknown type +;;(define-extern plane object) ;; unknown type +;;(define-extern vector3s object) ;; unknown type +(define-extern vector-dot function) +;;(define-extern *zero-vector* object) ;; unknown type +;;(define-extern vector4h object) ;; unknown type +;;(define-extern vector4w object) ;; unknown type +(define-extern box8s-array type) +;;(define-extern *null-vector* object) ;; unknown type +;;(define-extern qword object) ;; unknown type +;;(define-extern *up-vector* object) ;; unknown type +;;(define-extern vector4b object) ;; unknown type +;;(define-extern vector4w-4 object) ;; unknown type +;;(define-extern vertical-planes-array object) ;; unknown type +(define-extern vector4-dot function) +;;(define-extern vector2uh object) ;; unknown type +;;(define-extern sphere object) ;; unknown type +;;(define-extern vector3h object) ;; unknown type +;;(define-extern vector4w-3 object) ;; unknown type +(define-extern vector+! function) +(define-extern vector4-dot-vu function) +;;(define-extern box8s object) ;; unknown type +;;(define-extern vector3w object) ;; unknown type +(define-extern vector-reset! function) +;;(define-extern vector4w-2 object) ;; unknown type +;;(define-extern vector8h object) ;; unknown type +(define-extern vector-copy! function) +(define-extern vector type) +;;(define-extern bounding-box object) ;; unknown type +;;(define-extern bounding-box4w object) ;; unknown type +;;(define-extern bounding-box-both object) ;; unknown type +;;(define-extern matrix4h object) ;; unknown type +(define-extern matrix-copy! function) +;;(define-extern matrix3 object) ;; unknown type +;;(define-extern matrix object) ;; unknown type +;;(define-extern *unity-quaternion* object) ;; unknown type +;;(define-extern quaternion object) ;; unknown type +;;(define-extern euler-angles object) ;; unknown type +;;(define-extern EulNext object) ;; unknown type +;;(define-extern EulSafe object) ;; unknown type +;;(define-extern transform object) ;; unknown type +;;(define-extern trs object) ;; unknown type +;;(define-extern border-plane object) ;; unknown type +;;(define-extern curve object) ;; unknown type +;;(define-extern transformq object) ;; unknown type +;;(define-extern trsqv object) ;; unknown type +;;(define-extern trsq object) ;; unknown type +(define-extern deg-diff function) +(define-extern vector-y-angle function) +(define-extern box-vector-inside? function) +(define-extern box-vector-enside? function) +(define-extern vector3s-rotate*! function) +(define-extern matrix-inverse-of-rot-trans! function) +(define-extern matrix-3x3-determinant function) +(define-extern matrix-3x3-inverse-transpose! function) +(define-extern vector-matrix*! function) +(define-extern matrix-scale! function) +(define-extern column-scale-matrix! function) +(define-extern matrix-rotate-yx! function) +(define-extern matrix-y-angle function) +(define-extern matrix-3x3-inverse! function) +(define-extern matrix-rotate-z! function) +;;(define-extern *identity-matrix* object) ;; unknown type +(define-extern matrix-axis-angle! function) +(define-extern matrix-rotate-zyx! function) +(define-extern matrix-rotate-x! function) +(define-extern matrix+! function) +(define-extern matrix-rotate-yxy! function) +(define-extern matrix-identity! function) +(define-extern vector3s-matrix*! function) +(define-extern matrix-4x4-determinant function) +(define-extern matrix-inv-scale! function) +(define-extern matrix-rotate-yzx! function) +(define-extern matrix-axis-sin-cos! function) +(define-extern matrix-lerp! function) +(define-extern matrix-rotate-y! function) +(define-extern matrix*! function) +(define-extern matrix-rotate-xyz! function) +(define-extern scale-matrix! function) +(define-extern matrix-rotate-yxz! function) +(define-extern matrix-rotate-zxy! function) +(define-extern vector-rotate*! function) +(define-extern matrix3-determinant function) +(define-extern matrix3-inverse-transpose! function) +(define-extern matrix-translate+! function) +(define-extern matrix-transpose! function) +(define-extern matrix-4x4-inverse-transpose! function) +(define-extern matrixp*! function) +(define-extern matrix-axis-sin-cos-vu! function) +(define-extern matrix-translate! function) +(define-extern matrix-4x4-inverse! function) +(define-extern matrix-! function) +(define-extern atan function) +(define-extern vector-sincos! function) +(define-extern cos function) +(define-extern sin function) +(define-extern trs-matrix-calc! function) +(define-extern transform-matrix-parent-calc! function) +(define-extern transform-matrix-calc! function) +(define-extern vector-identity! function) +(define-extern quaternion-zero! function) +(define-extern quaternion-set! function) +(define-extern matrix->quaternion function) +(define-extern quaternion-exp! function) +(define-extern quaternion-axis-angle! function) +(define-extern quaternion-rotate-x! function) +(define-extern quaternion-validate function) +(define-extern quaternion-dot function) +(define-extern quaternion-normalize! function) +(define-extern vector-x-angle function) +(define-extern quaternion-k! function) +(define-extern quaternion-vector-len function) +(define-extern quaternion-rotate-local-x! function) +(define-extern matrix-with-scale->quaternion function) +(define-extern quaternion-rotate-y! function) +(define-extern vector-x-quaternion! function) +(define-extern quaternion-xz-angle function) +(define-extern quaternion-j! function) +(define-extern quaternion*! function) +(define-extern quaternion-right-mult-matrix! function) +(define-extern quaternion-left-mult-matrix! function) +(define-extern quaternion-negate! function) +(define-extern quaternion+! function) +(define-extern quaternion-norm function) +(define-extern quaternion-log! function) +(define-extern quaternion-rotate-local-z! function) +(define-extern quaternion-float*! function) +(define-extern quaternion-float/! function) +(define-extern quaternion-inverse! function) +(define-extern quaternion-pseudo-slerp! function) +(define-extern quaternion-vector-angle! function) +(define-extern quaterion<-rotate-y-vector function) +(define-extern quaternion-rotate-y-to-vector! function) +(define-extern quaternion-! function) +(define-extern vector-z-quaternion! function) +(define-extern quaternion-rotate-z! function) +(define-extern quaternion-slerp! function) +(define-extern quaternion->matrix function) +(define-extern quaternion-zxy! function) +(define-extern quaternion-delta-y function) +(define-extern vector-angle<-quaternion! function) +(define-extern quaternion-rotate-local-y! function) +(define-extern quaternion-norm2 function) +(define-extern quaternion-identity! function) +(define-extern quaternion-y-angle function) +(define-extern quaternion-vector-y-angle function) +(define-extern quaternion-copy! function) +(define-extern quaternion-conjugate! function) +(define-extern vector-y-quaternion! function) +(define-extern vector-rotate-y! function) +(define-extern quaternion-i! function) +(define-extern sincos-rad! function) +(define-extern vector-sincos-rad! function) +(define-extern vector-xz-normalize! function) +(define-extern atan-series-rad function) +(define-extern atan2-rad function) +(define-extern quaternion-from-two-vectors-max-angle! function) +(define-extern vector-length function) +(define-extern vector-rad<-vector-deg/2! function) +(define-extern vector-sin-rad! function) +(define-extern acos-rad function) +(define-extern vector-xz-length function) +(define-extern acos function) +(define-extern quat->eul function) +(define-extern set-eul! function) +(define-extern eul->matrix function) +(define-extern eul->quat function) +(define-extern matrix->eul function) +(define-extern vector-reflect-flat! function) +(define-extern forward-down->inv-matrix function) +(define-extern circle-test function) +(define-extern vector-line-distance-point! function) +(define-extern curve-evaluate! function) +(define-extern vector-reflect! function) +(define-extern matrix-from-two-vectors! function) +(define-extern matrix-from-two-vectors-partial-linear! function) +(define-extern forward-up->quaternion function) +(define-extern find-knot-span function) +(define-extern vector-vector-deg-slerp! function) +(define-extern matrix-from-two-vectors-max-angle! function) +(define-extern curve-length function) +(define-extern matrix-from-two-vectors-max-angle-partial! function) +(define-extern vector-deg-slerp function) +(define-extern vector-segment-distance-point! function) +(define-extern forward-up-nopitch->inv-matrix function) +(define-extern normal-of-plane function) +(define-extern vector-line-distance function) +(define-extern calculate-basis-functions-vector! function) +(define-extern vector-deg-seek function) +(define-extern point-in-plane-<-point+normal! function) +(define-extern matrix-rot-diff! function) +(define-extern point-in-triangle-cross function) +(define-extern matrix-remove-z-rot function) +(define-extern quaternion-seek function) +(define-extern vector-3pt-cross! function) +(define-extern vector-circle-tangent function) +(define-extern circle-circle-xz-intersect function) +(define-extern vector-plane-distance function) +(define-extern quaternion-from-two-vectors! function) +(define-extern closest-pt-in-triangle function) +(define-extern vector-flatten! function) +(define-extern vector-orient-by-quat! function) +(define-extern vector-reflect-true-flat! function) +(define-extern forward-up-nopitch->quaternion function) +(define-extern curve-copy! function) +(define-extern curve-get-pos! function) +(define-extern curve-closest-point function) +(define-extern forward-down-nopitch->inv-matrix function) +(define-extern vector-reflect-flat-above! function) +(define-extern vector-circle-tangent-new function) +(define-extern vector-vector-distance-squared function) +(define-extern vector-cross! function) +(define-extern vector+float*! function) +(define-extern vector-normalize! function) +(define-extern vector-negate! function) +(define-extern vector-vector-distance function) +(define-extern vector-normalize-ret-len! function) +(define-extern vector-normalize-copy! function) +(define-extern vector-float*! function) +(define-extern coserp function) +(define-extern sinerp-clamp function) +;;(define-extern exp-slead object) ;; unknown type +(define-extern coserp180-clamp function) +;;(define-extern *sin-poly-vec2* object) ;; unknown type +(define-extern exp function) +(define-extern deg-lerp-clamp function) +(define-extern deg- function) +(define-extern atan-rad function) +(define-extern deg-seek function) +(define-extern coserp180 function) +(define-extern sign function) +(define-extern sinerp function) +;;(define-extern *sin-poly-vec* object) ;; unknown type +(define-extern ease-in-out function) +(define-extern cos-rad function) +(define-extern atan0 function) +(define-extern asin function) +(define-extern vector-cos-rad! function) +;;(define-extern sincos-table object) ;; unknown type +;;(define-extern exp-strail object) ;; unknown type +(define-extern tan-rad function) +(define-extern coserp-clamp function) +(define-extern tan function) +(define-extern sin-rad function) +;;(define-extern float-type object) ;; unknown type +(define-extern deg-seek-smooth function) +;;(define-extern binary-table object) ;; unknown type +;;(define-extern *cos-poly-vec* object) ;; unknown type +(define-extern sincos! function) +(define-extern vector-rad<-vector-deg! function) +(define-extern radmod function) +;;(define-extern sound-rpc-set-falloff-curve object) ;; unknown type +;;(define-extern *sound-bank-2* object) ;; unknown type +;;(define-extern sound-rpc-reload-info object) ;; unknown type +;;(define-extern sound-rpc-stop-sound object) ;; unknown type +;;(define-extern sound-rpc-list-sounds object) ;; unknown type +;;(define-extern *current-sound-id* object) ;; unknown type +;;(define-extern sound-bank-id object) ;; unknown type +;;(define-extern sound-rpc-get-irx-version object) ;; unknown type +;;(define-extern sound-rpc-load-music object) ;; unknown type +;;(define-extern sound-rpc-set-ear-trans object) ;; unknown type +;;(define-extern ambient-sound object) ;; unknown type +;;(define-extern sound-rpc-pause-group object) ;; unknown type +;;(define-extern sound-rpc-shutdown object) ;; unknown type +;;(define-extern sound-rpc-unload-bank object) ;; unknown type +;;(define-extern sound-rpc-pause-sound object) ;; unknown type +;;(define-extern sound-id object) ;; unknown type +;;(define-extern sound-play-parms object) ;; unknown type +;;(define-extern sound-rpc-load-bank object) ;; unknown type +;;(define-extern sound-rpc-set-master-volume object) ;; unknown type +;;(define-extern sound-rpc-set-param object) ;; unknown type +;;(define-extern *sound-bank-1* object) ;; unknown type +;;(define-extern sound-rpc-stop-group object) ;; unknown type +;;(define-extern sound-rpc-play object) ;; unknown type +;;(define-extern sound-rpc-cmd object) ;; unknown type +(define-extern sound-spec type) +;;(define-extern sound-rpc-set-sound-falloff object) ;; unknown type +;;(define-extern sound-rpc-union object) ;; unknown type +;;(define-extern sound-rpc-unload-music object) ;; unknown type +;;(define-extern sound-rpc-set-language object) ;; unknown type +;;(define-extern sound-rpc-set-reverb object) ;; unknown type +;;(define-extern sound-rpc-sound-cmd object) ;; unknown type +;;(define-extern sound-rpc-group-cmd object) ;; unknown type +;;(define-extern sound-rpc-bank-cmd object) ;; unknown type +;;(define-extern sound-rpc-continue-sound object) ;; unknown type +;;(define-extern sound-rpc-set-flava object) ;; unknown type +;;(define-extern sound-name object) ;; unknown type +;;(define-extern sound-rpc-continue-group object) ;; unknown type +;;(define-extern timer-mode object) ;; unknown type +;;(define-extern timer-hold-bank object) ;; unknown type +;;(define-extern stopwatch object) ;; unknown type +;;(define-extern *ticks-per-frame* object) ;; unknown type +;;(define-extern profile-bar object) ;; unknown type +(define-extern timer-init function) +;;(define-extern timer-bank object) ;; unknown type +;;(define-extern profile-frame object) ;; unknown type +(define-extern stopwatch-init function) +(define-extern stopwatch-elapsed-seconds function) +(define-extern stopwatch-begin function) +(define-extern stopwatch-elapsed-ticks function) +(define-extern disable-irq function) +(define-extern timer-reset function) +(define-extern enable-irq function) +(define-extern stopwatch-start function) +(define-extern timer-count function) +(define-extern stopwatch-end function) +(define-extern stopwatch-stop function) +(define-extern stopwatch-reset function) +;;(define-extern vif-stat object) ;; unknown type +;;(define-extern vif-fbrst object) ;; unknown type +;;(define-extern vif-err object) ;; unknown type +;;(define-extern vif-bank object) ;; unknown type +(define-extern dma-count-until-done function) +;;(define-extern vif-tag object) ;; unknown type +(define-extern dma-send-no-scratch function) +;;(define-extern dma-tag object) ;; unknown type +;;(define-extern dma-chcr object) ;; unknown type +;;(define-extern dma-bank-spr object) ;; unknown type +;;(define-extern dma-bucket object) ;; unknown type +(define-extern dma-sync-with-count function) +;;(define-extern vu-code-block object) ;; unknown type +(define-extern dma-sync-fast function) +;;(define-extern vif-mask object) ;; unknown type +;;(define-extern dma-bank-control object) ;; unknown type +;;(define-extern vif-unpack-imm object) ;; unknown type +;;(define-extern dma-ctrl object) ;; unknown type +;;(define-extern dma-enable object) ;; unknown type +;;(define-extern vu-stat object) ;; unknown type +;;(define-extern dma-bank-source object) ;; unknown type +;;(define-extern dma-bank-vif object) ;; unknown type +;;(define-extern dma-sqwc object) ;; unknown type +;;(define-extern vif-stcycl-imm object) ;; unknown type +;;(define-extern dma-bank object) ;; unknown type +;;(define-extern flush-cache object) ;; unknown type +;;(define-extern *video-parms* object) ;; unknown type +;;(define-extern video-parms object) ;; unknown type +;;(define-extern generic-bucket-state object) ;; unknown type +;;(define-extern *vu1-enable-user-menu* object) ;; unknown type +(define-extern dma-foreground-sink type) +(define-extern dma-foreground-sink-group type) +;;(define-extern *vu1-enable-user* object) ;; unknown type +(define-extern generic-dma-foreground-sink type) +(define-extern reset-vif1-path function) +(define-extern dump-vu1-range function) +(define-extern symlink3 function) +(define-extern dma-sync-crash function) +(define-extern clear-vu0-mem function) +(define-extern dump-vu1-mem function) +(define-extern dma-send-from-spr function) +(define-extern dma-send-to-spr function) +(define-extern dma-sync-hang function) +(define-extern symlink2 function) +(define-extern ultimate-memcpy function) +(define-extern dma-send-to-spr-no-flush function) +(define-extern dma-initialize function) +(define-extern dma-send function) +(define-extern dma-send-chain-no-flush function) +(define-extern clear-vu1-mem function) +(define-extern dma-send-from-spr-no-flush function) +;;(define-extern *video-reset-parm* object) ;; unknown type +(define-extern dma-send-chain function) +(define-extern dma-send-chain-no-tte function) +;;(define-extern reset-path object) ;; unknown type +;;(define-extern reset-graph object) ;; unknown type +;;(define-extern dma-sync object) ;; unknown type +;;(define-extern dma-packet-array object) ;; unknown type +(define-extern dma-buffer-inplace-new function) +(define-extern dma-buffer-length function) +;;(define-extern dma-gif-packet object) ;; unknown type +(define-extern dma-buffer-free function) +(define-extern dma-buffer-add-vu-function function) +;;(define-extern dma-packet object) ;; unknown type +;;(define-extern dma-buffer object) ;; unknown type +(define-extern dma-buffer-send-chain function) +(define-extern dma-buffer-send function) +(define-extern dma-bucket-insert-tag function) +(define-extern dma-buffer-add-buckets function) +(define-extern dma-buffer-patch-buckets function) +;;(define-extern *vif-disasm-table* object) ;; unknown type +(define-extern disasm-vif-tag function) +(define-extern disasm-dma-tag function) +(define-extern disasm-vif-details function) +(define-extern vif-disasm-element type) +;;(define-extern *dma-disasm* object) ;; unknown type +(define-extern disasm-dma-list function) +;;(define-extern error object) ;; unknown type +;;(define-extern details object) ;; unknown type +(define-extern cpad-set-buzz! function) +;;(define-extern *cpad-debug* object) ;; unknown type +(define-extern analog-input function) +(define-extern buzz-stop! function) +;;(define-extern cpad-info object) ;; unknown type +;;(define-extern hw-cpad object) ;; unknown type +(define-extern cpad-invalid! function) +;;(define-extern cpad-list object) ;; unknown type +;;(define-extern *cheat-mode* object) ;; unknown type +;;(define-extern *cpad-list* object) ;; unknown type +(define-extern service-cpads function) +(define-extern get-integral-current-time function) +(define-extern get-current-time function) +;;(define-extern cpad-get-data object) ;; unknown type +;;(define-extern cpad-open object) ;; unknown type +(define-extern psm->string function) +;;(define-extern gs-trxreg object) ;; unknown type +;;(define-extern gif-packet object) ;; unknown type +;;(define-extern gs-fogcol object) ;; unknown type +;;(define-extern gs-zbuf object) ;; unknown type +;;(define-extern gif-bank object) ;; unknown type +;;(define-extern *fog-color* object) ;; unknown type +;;(define-extern gs-trxpos object) ;; unknown type +;;(define-extern gs-xy-offset object) ;; unknown type +;;(define-extern gs-tex1 object) ;; unknown type +;;(define-extern gs-prim object) ;; unknown type +;;(define-extern gif-tag object) ;; unknown type +;;(define-extern gs-display object) ;; unknown type +;;(define-extern gs-prmode-cont object) ;; unknown type +;;(define-extern gs-scissor object) ;; unknown type +;;(define-extern gs-st object) ;; unknown type +;;(define-extern gs-smode2 object) ;; unknown type +(define-extern add-reg-gif-packet function) +;;(define-extern draw-context object) ;; unknown type +;;(define-extern gs-texclut object) ;; unknown type +;;(define-extern gs-bgcolor object) ;; unknown type +(define-extern open-gif-packet function) +;;(define-extern gif-tag-count object) ;; unknown type +;;(define-extern gs-test object) ;; unknown type +;;(define-extern gs-tex0 object) ;; unknown type +;;(define-extern gif-tag64 object) ;; unknown type +;;(define-extern gs-alpha object) ;; unknown type +;;(define-extern gs-miptbp object) ;; unknown type +;;(define-extern gs-color-clamp object) ;; unknown type +;;(define-extern gif-p3cnt object) ;; unknown type +;;(define-extern gs-clamp object) ;; unknown type +;;(define-extern gs-uv object) ;; unknown type +;;(define-extern gif-stat object) ;; unknown type +(define-extern psm-page-height function) +;;(define-extern gif-mode object) ;; unknown type +(define-extern psm-size function) +;;(define-extern gs-trxdir object) ;; unknown type +;;(define-extern gs-xyzf object) ;; unknown type +;;(define-extern gs-csr object) ;; unknown type +(define-extern draw-context-set-xy function) +;;(define-extern *default-regs-buffer* object) ;; unknown type +;;(define-extern gs-frame object) ;; unknown type +;;(define-extern gs-texa object) ;; unknown type +;;(define-extern gs-bank object) ;; unknown type +;;(define-extern gif-cnt object) ;; unknown type +;;(define-extern gif-ctrl object) ;; unknown type +;;(define-extern gs-gif-tag object) ;; unknown type +;;(define-extern gs-pmode object) ;; unknown type +;;(define-extern gs-dthe object) ;; unknown type +;;(define-extern gs-fog object) ;; unknown type +;;(define-extern gs-xyz object) ;; unknown type +(define-extern default-buffer-init function) +;;(define-extern gif-tag-prim object) ;; unknown type +;;(define-extern gif-p3tag object) ;; unknown type +(define-extern close-gif-packet function) +;;(define-extern gs-display-fb object) ;; unknown type +;;(define-extern gs-bitbltbuf object) ;; unknown type +;;(define-extern gs-rgbaq object) ;; unknown type +;;(define-extern display-env object) ;; unknown type +;;(define-extern display-frame object) ;; unknown type +;;(define-extern display object) ;; unknown type +;;(define-extern *post-draw-hook* object) ;; unknown type +;;(define-extern virtual-frame object) ;; unknown type +(define-extern put-draw-env function) +;;(define-extern draw-env object) ;; unknown type +;;(define-extern *pre-draw-hook* object) ;; unknown type +(define-extern set-display function) +(define-extern vector4-lerp! function) +(define-extern rotate-y<-vector+vector function) +(define-extern rot-zxy-from-vector! function) +(define-extern vector3s-copy! function) +(define-extern vector-seek-2d-yz-smooth! function) +(define-extern vector-from-ups! function) +(define-extern vector-seek-2d-xz-smooth! function) +(define-extern vector/! function) +(define-extern rand-vu-sphere-point! function) +(define-extern vector-vector-xz-distance function) +(define-extern vector-v*float+! function) +(define-extern vector-length-max! function) +(define-extern vector*! function) +(define-extern vector+*! function) +(define-extern vector-deg-lerp-clamp! function) +(define-extern vector-negate-in-place! function) +(define-extern vector--float*! function) +(define-extern rot-zyx-from-vector! function) +(define-extern vector4-lerp-clamp! function) +(define-extern vector-seconds! function) +(define-extern vector-degmod function) +(define-extern vector-v*float++! function) +(define-extern vector-degi function) +(define-extern sphere<-vector+r! function) +(define-extern vector-xz-length-max! function) +(define-extern vector3s-! function) +(define-extern vector3s+! function) +(define-extern vector-average! function) +(define-extern vector-cvt.w.s! function) +(define-extern vector-v! function) +(define-extern vector-degf function) +(define-extern vector-vector-xz-distance-squared function) +(define-extern vector-xz-length-squared function) +(define-extern vector-lerp-clamp! function) +(define-extern vector-cvt.s.w! function) +(define-extern vector-to-ups! function) +(define-extern vector-seek! function) +(define-extern vector-seconds function) +(define-extern vector-deg-diff function) +(define-extern vector-delta function) +(define-extern vector+float! function) +(define-extern vector-v+! function) +(define-extern vector3s*float! function) +(define-extern spheres-overlap? function) +(define-extern vector-length-squared function) +(define-extern vector-lerp! function) +(define-extern vector-rotate-around-y! function) +(define-extern vector-*! function) +(define-extern seek-with-smooth function) +(define-extern vector-v*float! function) +(define-extern vector-v++! function) +(define-extern vector-seek-3d-smooth! function) +(define-extern sphere<-vector! function) +(define-extern vector-float/! function) +(define-extern vector= function) +;;(define-extern *display* object) ;; unknown type +(define-extern make-vfile-name function) +;;(define-extern file-stream object) ;; unknown type +(define-extern file-info type) +(define-extern make-file-name function) +(define-extern file-info-correct-version? function) +;;(define-extern *file-temp-string* object) ;; unknown type +(define-extern file-stream-read-string function) +;;(define-extern file-stream-length object) ;; unknown type +;;(define-extern file-stream-read object) ;; unknown type +;;(define-extern file-stream-open object) ;; unknown type +;;(define-extern load-dir object) ;; unknown type +;;(define-extern external-art-buffer object) ;; unknown type +;;(define-extern load-dir-art-group object) ;; unknown type +(define-extern spool-anim type) +;;(define-extern external-art-control object) ;; unknown type +(define-extern art-group type) +;;(define-extern texture-page-segment object) ;; unknown type +;;(define-extern *sky-base-block* object) ;; unknown type +;;(define-extern *depth-cue-base-block* object) ;; unknown type +;;(define-extern *depth-cue-base-vram-word* object) ;; unknown type +;;(define-extern *eyes-base-block* object) ;; unknown type +;;(define-extern *ocean-base-page* object) ;; unknown type +(define-extern adgif-shader-array type) +;;(define-extern adgif-shader object) ;; unknown type +(define-extern texture type) +;;(define-extern *texture-enable-user* object) ;; unknown type +;;(define-extern texture-page-dir-entry object) ;; unknown type +;;(define-extern texture-pool object) ;; unknown type +;;(define-extern *ocean-base-block* object) ;; unknown type +;;(define-extern *texture-page-dir* object) ;; unknown type +;;(define-extern *ocean-base-vram-word* object) ;; unknown type +;;(define-extern *texture-enable-user-menu* object) ;; unknown type +(define-extern texture-page type) +;;(define-extern *depth-cue-base-page* object) ;; unknown type +;;(define-extern texture-pool-segment object) ;; unknown type +;;(define-extern *texture-relocate-later* object) ;; unknown type +;;(define-extern *sky-base-vram-word* object) ;; unknown type +;;(define-extern texture-id object) ;; unknown type +;;(define-extern *sky-base-page* object) ;; unknown type +(define-extern texture-page-dir type) +;;(define-extern texture-relocate-later object) ;; unknown type +;;(define-extern texture-link object) ;; unknown type +(define-extern texture-mip->segment function) +;;(define-extern shader-ptr object) ;; unknown type +;;(define-extern *eyes-base-vram-word* object) ;; unknown type +;;(define-extern *eyes-base-page* object) ;; unknown type +;;(define-extern login-state object) ;; unknown type +(define-extern level-vis-info type) +(define-extern level-load-info type) +;;(define-extern *level* object) ;; unknown type +(define-extern level-group type) +(define-extern level type) +;;(define-extern reserved object) ;; unknown type +;;(define-extern default object) ;; unknown type +;;(define-extern inactive object) ;; unknown type +;;(define-extern cull-info object) ;; unknown type +;;(define-extern math-camera object) ;; unknown type +;;(define-extern vis-gif-tag object) ;; unknown type +;;(define-extern *math-camera* object) ;; unknown type +;;(define-extern *math-camera-fog-correction* object) ;; unknown type +(define-extern init-for-transform function) +(define-extern move-target-from-pad function) +(define-extern transform-point-vector! function) +(define-extern fog-corrector-setup function) +;;(define-extern fog-corrector object) ;; unknown type +(define-extern math-cam-start-smoothing function) +(define-extern update-math-camera function) +(define-extern transform-point-qword! function) +(define-extern transform-point-vector-scale! function) +(define-extern sprite-distorter-generate-tables function) +;;(define-extern ntsc object) ;; unknown type +;;(define-extern aspect4x3 object) ;; unknown type +;;(define-extern font-work object) ;; unknown type +(define-extern font-set-tex0 function) +;;(define-extern *font-default-matrix* object) ;; unknown type +;;(define-extern char-verts object) ;; unknown type +;;(define-extern char-color object) ;; unknown type +;;(define-extern font-context object) ;; unknown type +;;(define-extern *font-work* object) ;; unknown type +;;(define-extern decomp-work object) ;; unknown type +;;(define-extern install-handler object) ;; unknown type +;;(define-extern *oddeven* object) ;; unknown type +;;(define-extern *profile-y* object) ;; unknown type +(define-extern vif1-handler function) +;;(define-extern *pause-context* object) ;; unknown type +;;(define-extern *profile-h* object) ;; unknown type +;;(define-extern *profile-x* object) ;; unknown type +(define-extern set-draw-env-offset function) +;;(define-extern *vblank-counter* object) ;; unknown type +;;(define-extern *vu0-dma-list* object) ;; unknown type +;;(define-extern *profile-w* object) ;; unknown type +(define-extern set-display-gs-state function) +(define-extern draw-quad2d function) +(define-extern put-display-alpha-env function) +(define-extern set-display-gs-state-offset function) +(define-extern screen-gradient function) +(define-extern draw-sprite2d-xy function) +(define-extern set-draw-env function) +(define-extern reset-display-gs-state function) +(define-extern vblank-handler function) +;;(define-extern *profile-ticks* object) ;; unknown type +;;(define-extern *font-context* object) ;; unknown type +(define-extern vif1-handler-debug function) +(define-extern set-display-env function) +(define-extern set-display2 function) +(define-extern allocate-dma-buffers function) +(define-extern draw-string-xy function) +;;(define-extern end-draw object) ;; unknown type +(define-extern start function) +;;(define-extern pal object) ;; unknown type +(define-extern get-video-mode function) +;;(define-extern end-calc object) ;; unknown type +;;(define-extern engine object) ;; unknown type +;;(define-extern connectable object) ;; unknown type +(define-extern connection-process-apply function) +;;(define-extern connection object) ;; unknown type +;;(define-extern *common-text* object) ;; unknown type +;;(define-extern *common-text-heap* object) ;; unknown type +;;(define-extern kheap object) ;; unknown type +;;(define-extern *text-group-names* object) ;; unknown type +;;(define-extern game-text-info object) ;; unknown type +;;(define-extern game-text object) ;; unknown type +;;(define-extern scf-time object) ;; unknown type +;;(define-extern setting-data object) ;; unknown type +;;(define-extern setting-control object) ;; unknown type +(define-extern store-image function) +;;(define-extern gs-store-image-packet object) ;; unknown type +(define-extern gs-set-default-store-image function) +;;(define-extern file-stream-close object) ;; unknown type +;;(define-extern file-stream-write object) ;; unknown type +;;(define-extern write object) ;; unknown type +;;(define-extern gs-store-image object) ;; unknown type +;;(define-extern sync-path object) ;; unknown type +;;(define-extern *temp-mem-usage* object) ;; unknown type +;;(define-extern *mem-usage* object) ;; unknown type +;;(define-extern memory-usage-block object) ;; unknown type +;;(define-extern *dma-mem-usage* object) ;; unknown type +;;(define-extern memory-usage-info object) ;; unknown type +(define-extern upload-vram-pages function) +;;(define-extern *shader-list* object) ;; unknown type +(define-extern adgif-shader-login-no-remap-fast function) +;;(define-extern mt8-block-table object) ;; unknown type +(define-extern texture-bpp function) +(define-extern gs-blocks-used function) +(define-extern relocate-later function) +(define-extern gs-page-width function) +(define-extern upload-vram-pages-pris function) +;;(define-extern ct16s-block-table object) ;; unknown type +;;(define-extern *txt-dma-list* object) ;; unknown type +(define-extern adgif-shader-login-fast function) +(define-extern gs-page-height function) +;;(define-extern mz16s-block-table object) ;; unknown type +(define-extern lookup-texture-by-id function) +;;(define-extern *texture-pool* object) ;; unknown type +(define-extern dma-buffer-add-ref-texture function) +(define-extern link-texture-by-id function) +;;(define-extern mt4-block-table object) ;; unknown type +;;(define-extern *edit-shader* object) ;; unknown type +(define-extern adgif-shader-update! function) +;;(define-extern ct16-block-table object) ;; unknown type +(define-extern texture-page-common-boot-allocate function) +(define-extern gs-find-block function) +(define-extern texture-page-level-allocate function) +(define-extern texture-page-common-allocate function) +(define-extern texture-page-login function) +(define-extern texture-page-dir-inspect function) +(define-extern texture-qwc function) +(define-extern adgif-shader-login function) +(define-extern adgif-shader-login-no-remap function) +;;(define-extern mz16-block-table object) ;; unknown type +(define-extern gs-largest-block function) +;;(define-extern ct32-24-block-table object) ;; unknown type +(define-extern gs-block-width function) +(define-extern adgif-shader<-texture-simple! function) +(define-extern texture-relocate function) +(define-extern adgif-shader<-texture! function) +(define-extern update-vram-pages function) +(define-extern texture-page-near-allocate-0 function) +;;(define-extern mz32-24-block-table object) ;; unknown type +(define-extern texture-page-default-allocate function) +(define-extern texture-page-size-check function) +(define-extern gs-block-height function) +(define-extern physical-address function) +(define-extern upload-vram-data function) +(define-extern texture-page-near-allocate-1 function) +;;(define-extern *font-texture* object) ;; unknown type +(define-extern adgif-shader<-texture-with-update! function) +;;(define-extern full object) ;; unknown type +;;(define-extern active object) ;; unknown type +;;(define-extern loado object) ;; unknown type +(define-extern movie? function) +(define-extern level-remap-texture function) +;;(define-extern loading-level object) ;; unknown type +;;(define-extern *display-split-boxes* object) ;; unknown type +;;(define-extern frame-stats object) ;; unknown type +;;(define-extern *artist-fix-visible* object) ;; unknown type +;;(define-extern *ambient-sound-class* object) ;; unknown type +;;(define-extern *display-art-control* object) ;; unknown type +;;(define-extern *display-camera-info* object) ;; unknown type +;;(define-extern *display-profile* object) ;; unknown type +;;(define-extern *display-ambient-poi-marks* object) ;; unknown type +;;(define-extern *artist-all-visible* object) ;; unknown type +;;(define-extern *display-edge-collision-marks* object) ;; unknown type +;;(define-extern *stats-poly* object) ;; unknown type +;;(define-extern *dproc* object) ;; unknown type +;;(define-extern *display-ambient-light-marks* object) ;; unknown type +;;(define-extern *display-cam-other* object) ;; unknown type +;;(define-extern *frame-stats* object) ;; unknown type +;;(define-extern *display-lights* object) ;; unknown type +;;(define-extern *display-instance-info* object) ;; unknown type +;;(define-extern *stats-memory* object) ;; unknown type +;;(define-extern *display-ambient-music-marks* object) ;; unknown type +;;(define-extern *weather-off* object) ;; unknown type +;;(define-extern *debug-pause* object) ;; unknown type +;;(define-extern *progress-hook* object) ;; unknown type +;;(define-extern *display-ambient-dark-marks* object) ;; unknown type +;;(define-extern *time-of-day-effects* object) ;; unknown type +;;(define-extern *display-file-info* object) ;; unknown type +;;(define-extern *display-iop-info* object) ;; unknown type +;;(define-extern *display-geo-marks* object) ;; unknown type +;;(define-extern *ocean-subdivide-draw-mode* object) ;; unknown type +(define-extern screen-filter type) +;;(define-extern *time-of-day-fast* object) ;; unknown type +;;(define-extern *stats-dma-test* object) ;; unknown type +;;(define-extern *subdivide-draw-mode* object) ;; unknown type +;;(define-extern *display-split-box-info* object) ;; unknown type +;;(define-extern *display-ground-stats* object) ;; unknown type +;;(define-extern *teleport-count* object) ;; unknown type +;;(define-extern *stats-target* object) ;; unknown type +;;(define-extern *sync-dma* object) ;; unknown type +;;(define-extern *stats-memory-short* object) ;; unknown type +;;(define-extern *display-entity-errors* object) ;; unknown type +;;(define-extern *display-collide-history* object) ;; unknown type +;;(define-extern *display-sidekick-stats* object) ;; unknown type +;;(define-extern *display-nav-marks* object) ;; unknown type +;;(define-extern *display-camera-old-stats* object) ;; unknown type +;;(define-extern *display-perf-stats* object) ;; unknown type +;;(define-extern *draw-hook* object) ;; unknown type +;;(define-extern *stats-collide* object) ;; unknown type +;;(define-extern *display-cam-collide-history* object) ;; unknown type +;;(define-extern *debug-hook* object) ;; unknown type +;;(define-extern *artist-error-spheres* object) ;; unknown type +;;(define-extern *display-quad-stats* object) ;; unknown type +;;(define-extern *display-cam-los-info* object) ;; unknown type +;;(define-extern *display-camera-last-attacker* object) ;; unknown type +;;(define-extern *display-collide-cache* object) ;; unknown type +;;(define-extern *display-collision-marks* object) ;; unknown type +;;(define-extern *display-actor-anim* object) ;; unknown type +;;(define-extern *display-tri-stats* object) ;; unknown type +;;(define-extern *run* object) ;; unknown type +;;(define-extern *display-cam-coll-marks* object) ;; unknown type +;;(define-extern *display-ambient-hint-marks* object) ;; unknown type +;;(define-extern *display-cam-los-debug* object) ;; unknown type +;;(define-extern *display-strip-lines* object) ;; unknown type +;;(define-extern *display-process-anim* object) ;; unknown type +;;(define-extern *display-actor-marks* object) ;; unknown type +(define-extern *menu-hook* function) +;;(define-extern *display-load-boundaries* object) ;; unknown type +;;(define-extern *display-water-marks* object) ;; unknown type +;;(define-extern *artist-flip-visible* object) ;; unknown type +;;(define-extern *display-level-spheres* object) ;; unknown type +;;(define-extern *teleport* object) ;; unknown type +;;(define-extern *display-cam-master-marks* object) ;; unknown type +;;(define-extern *display-ambient-sound-marks* object) ;; unknown type +;;(define-extern *artist-fix-frustum* object) ;; unknown type +;;(define-extern *display-ambient-weather-off-marks* object) ;; unknown type +;;(define-extern *display-cam-los-marks* object) ;; unknown type +;;(define-extern *stats-bsp* object) ;; unknown type +;;(define-extern *display-ambient-ocean-near-off-marks* object) ;; unknown type +;;(define-extern *display-texture-download* object) ;; unknown type +;;(define-extern *artist-use-menu-subdiv* object) ;; unknown type +;;(define-extern *display-xyz-axes* object) ;; unknown type +;;(define-extern *record-cam-collide-history* object) ;; unknown type +;;(define-extern *display-deci-count* object) ;; unknown type +;;(define-extern *display-memcard-info* object) ;; unknown type +;;(define-extern *slow-frame-rate* object) ;; unknown type +;;(define-extern *display-ambient-ocean-off-marks* object) ;; unknown type +;;(define-extern *display-target-marks* object) ;; unknown type +;;(define-extern *camera-no-mip-correction* object) ;; unknown type +;;(define-extern *display-path-marks* object) ;; unknown type +;;(define-extern *dma-timeout-hook* object) ;; unknown type +;;(define-extern *display-camera-marks* object) ;; unknown type +;;(define-extern *display-level-border* object) ;; unknown type +;;(define-extern *display-hipri-collision-marks* object) ;; unknown type +;;(define-extern *display-sprite-info* object) ;; unknown type +;;(define-extern *display-actor-graph* object) ;; unknown type +;;(define-extern *stats-buffer* object) ;; unknown type +;;(define-extern *display-vol-marks* object) ;; unknown type +;;(define-extern *display-actor-vis* object) ;; unknown type +;;(define-extern *display-render-collision* object) ;; unknown type +;;(define-extern cspace object) ;; unknown type +;;(define-extern bone object) ;; unknown type +;;(define-extern cspace-array object) ;; unknown type +;;(define-extern bone-cache object) ;; unknown type +(define-extern joint type) +;;(define-extern skeleton object) ;; unknown type +;;(define-extern drawable-error object) ;; unknown type +;;(define-extern drawable object) ;; unknown type +;;(define-extern *collide-nodes* object) ;; unknown type +;;(define-extern drawable-group object) ;; unknown type +;;(define-extern drawable-inline-array object) ;; unknown type +;;(define-extern draw-node-dma object) ;; unknown type +(define-extern draw-node type) +(define-extern drawable-inline-array-node type) +(define-extern drawable-tree-array type) +;;(define-extern drawable-tree object) ;; unknown type +(define-extern drawable-actor type) +(define-extern drawable-tree-actor type) +(define-extern drawable-inline-array-actor type) +(define-extern drawable-ambient type) +;;(define-extern level-hint object) ;; unknown type +(define-extern drawable-inline-array-ambient type) +(define-extern drawable-tree-ambient type) +;;(define-extern ambient-list object) ;; unknown type +(define-extern level-hint-control type) +(define-extern task-hint-control type) +(define-extern task-hint-control-group type) +;;(define-extern generic-interp-job object) ;; unknown type +;;(define-extern ad-cmd object) ;; unknown type +;;(define-extern generic-strip object) ;; unknown type +;;(define-extern gsf-vertex object) ;; unknown type +;;(define-extern gsf-ik object) ;; unknown type +;;(define-extern generic-gif-tag object) ;; unknown type +;;(define-extern kmalloc object) ;; unknown type +;;(define-extern gsf-fx-vertex-array object) ;; unknown type +;;(define-extern generic-envmap-saves object) ;; unknown type +;;(define-extern generic-storage object) ;; unknown type +;;(define-extern gsf-vertex-array object) ;; unknown type +;;(define-extern gsf-info object) ;; unknown type +;;(define-extern gsf-buffer object) ;; unknown type +;;(define-extern generic-frag object) ;; unknown type +;;(define-extern generic-saves object) ;; unknown type +;;(define-extern gsf-header object) ;; unknown type +;;(define-extern gsf-fx-vertex object) ;; unknown type +;;(define-extern *gsf-buffer* object) ;; unknown type +;;(define-extern generic-consts object) ;; unknown type +;;(define-extern generic-envmap-consts object) ;; unknown type +;;(define-extern vu-lights object) ;; unknown type +;;(define-extern light-ellipse object) ;; unknown type +;;(define-extern light-array object) ;; unknown type +;;(define-extern light-volume-array object) ;; unknown type +;;(define-extern light-volume object) ;; unknown type +;;(define-extern light-group object) ;; unknown type +;;(define-extern light object) ;; unknown type +;;(define-extern light-volume-sphere object) ;; unknown type +;;(define-extern light-volume-planes object) ;; unknown type +(define-extern ocean-trans-indices type) +(define-extern ocean-work type) +;;(define-extern ocean-mid-upload object) ;; unknown type +;;(define-extern ocean-vertex object) ;; unknown type +;;(define-extern ocean-mid-mask object) ;; unknown type +;;(define-extern *ocean-facing* object) ;; unknown type +(define-extern ocean-mid-masks type) +;;(define-extern ocean-mid-vertex object) ;; unknown type +;;(define-extern *ocean-mid-off* object) ;; unknown type +;;(define-extern *ocean-verts* object) ;; unknown type +;;(define-extern ocean-trans-strip object) ;; unknown type +;;(define-extern *ocean-heights* object) ;; unknown type +;;(define-extern ocean-colors object) ;; unknown type +;;(define-extern ocean-vu0-work object) ;; unknown type +;;(define-extern ocean-corner object) ;; unknown type +;;(define-extern ocean-trans-index object) ;; unknown type +;;(define-extern ocean-texture-constants object) ;; unknown type +(define-extern ocean-map type) +;;(define-extern *ocean-near-off* object) ;; unknown type +(define-extern ocean-mid-indices type) +;;(define-extern ocean-trans-strip-array object) ;; unknown type +;;(define-extern ocean-mid-upload2 object) ;; unknown type +;;(define-extern ocean-near-upload object) ;; unknown type +;;(define-extern ocean-near-colors object) ;; unknown type +;;(define-extern ocean-texture-work object) ;; unknown type +;;(define-extern ocean-near-constants object) ;; unknown type +;;(define-extern ocean-near-index object) ;; unknown type +;;(define-extern ocean-wave-info object) ;; unknown type +;;(define-extern ocean-mid-work object) ;; unknown type +;;(define-extern *ocean-off* object) ;; unknown type +;;(define-extern ocean-near-work object) ;; unknown type +;;(define-extern *ocean-work* object) ;; unknown type +;;(define-extern ocean-wave-data object) ;; unknown type +(define-extern ocean-near-indices type) +;;(define-extern ocean-wave-frames object) ;; unknown type +;;(define-extern ocean-spheres object) ;; unknown type +;;(define-extern ocean-trans-mask object) ;; unknown type +;;(define-extern ocean-mid-constants object) ;; unknown type +;;(define-extern ocean-near-vertex object) ;; unknown type +;;(define-extern *ocean-trans-down-left-table* object) ;; unknown type +;;(define-extern *ocean-up-table* object) ;; unknown type +;;(define-extern *ocean-up-left-table* object) ;; unknown type +;;(define-extern *ocean-trans-up-left-table* object) ;; unknown type +;;(define-extern *ocean-trans-st-table* object) ;; unknown type +;;(define-extern *ocean-down-left-table* object) ;; unknown type +;;(define-extern *ocean-trans-down-table* object) ;; unknown type +;;(define-extern *ocean-trans-right-table* object) ;; unknown type +;;(define-extern *ocean-trans-down-right-table* object) ;; unknown type +;;(define-extern *ocean-trans-left-table* object) ;; unknown type +;;(define-extern *ocean-down-right-table* object) ;; unknown type +;;(define-extern *ocean-trans-up-right-table* object) ;; unknown type +;;(define-extern *ocean-trans-strip-array* object) ;; unknown type +;;(define-extern *ocean-left-table* object) ;; unknown type +;;(define-extern *ocean-trans-up-table* object) ;; unknown type +;;(define-extern *ocean-up-right-table* object) ;; unknown type +;;(define-extern *ocean-trans-corner-table* object) ;; unknown type +;;(define-extern *ocean-right-table* object) ;; unknown type +;;(define-extern *ocean-down-table* object) ;; unknown type +;;(define-extern *ocean-trans-indices-village2* object) ;; unknown type +;;(define-extern *ocean-trans-indices-village1* object) ;; unknown type +;;(define-extern *ocean-near-indices-village2* object) ;; unknown type +;;(define-extern *ocean-colors-village1* object) ;; unknown type +;;(define-extern *ocean-map-village2* object) ;; unknown type +;;(define-extern *ocean-trans-indices-sunken* object) ;; unknown type +;;(define-extern *ocean-map-sunken* object) ;; unknown type +;;(define-extern *ocean-mid-indices-sunken* object) ;; unknown type +;;(define-extern *ocean-mid-masks-village2* object) ;; unknown type +;;(define-extern *ocean-mid-indices-village1* object) ;; unknown type +;;(define-extern *ocean-near-indices-village1* object) ;; unknown type +;;(define-extern *ocean-spheres-village2* object) ;; unknown type +;;(define-extern *ocean-colors-village2* object) ;; unknown type +;;(define-extern *ocean-mid-masks-village1* object) ;; unknown type +;;(define-extern *ocean-near-indices-sunken* object) ;; unknown type +;;(define-extern *ocean-mid-indices-village2* object) ;; unknown type +;;(define-extern *ocean-mid-masks-sunken* object) ;; unknown type +;;(define-extern *ocean-map-village1* object) ;; unknown type +;;(define-extern *ocean-spheres-village1* object) ;; unknown type +;;(define-extern *ocean-wave-frames* object) ;; unknown type +;;(define-extern sky-color-hour object) ;; unknown type +;;(define-extern sky-circle-data object) ;; unknown type +;;(define-extern *sky-drawn* object) ;; unknown type +;;(define-extern sky-vertex object) ;; unknown type +;;(define-extern sky-sun-data object) ;; unknown type +;;(define-extern sky-color-day object) ;; unknown type +;;(define-extern *cloud-drawn* object) ;; unknown type +;;(define-extern sky-tng-data object) ;; unknown type +;;(define-extern sky-orbit object) ;; unknown type +;;(define-extern sky-upload-data object) ;; unknown type +;;(define-extern *sky-parms* object) ;; unknown type +;;(define-extern sky-moon-data object) ;; unknown type +;;(define-extern *sky-upload-data* object) ;; unknown type +;;(define-extern sky-work object) ;; unknown type +;;(define-extern sky-parms object) ;; unknown type +;;(define-extern mood-fog object) ;; unknown type +;;(define-extern mood-lights-table object) ;; unknown type +;;(define-extern mood-fog-table object) ;; unknown type +;;(define-extern mood-context object) ;; unknown type +;;(define-extern mood-sun-table object) ;; unknown type +;;(define-extern mood-lights object) ;; unknown type +;;(define-extern mood-sun object) ;; unknown type +(define-extern time-of-day-context type) +;;(define-extern *time-of-day-context* object) ;; unknown type +;;(define-extern palette-fade-control object) ;; unknown type +;;(define-extern *time-of-day-mode* object) ;; unknown type +;;(define-extern time-of-day-dma object) ;; unknown type +;;(define-extern palette-fade-controls object) ;; unknown type +;;(define-extern *palette-fade-controls* object) ;; unknown type +(define-extern time-of-day-palette type) +;;(define-extern time-of-day-proc object) ;; unknown type +(define-extern skeleton-group type) +(define-extern art-joint-anim type) +;;(define-extern joint-anim-compressed-control object) ;; unknown type +;;(define-extern joint-anim-matrix object) ;; unknown type +;;(define-extern art-mesh-geo object) ;; unknown type +;;(define-extern joint-anim-compressed-hdr object) ;; unknown type +;;(define-extern art-mesh-anim object) ;; unknown type +(define-extern joint-anim-compressed type) +;;(define-extern joint-anim-compressed-fixed object) ;; unknown type +;;(define-extern art-element object) ;; unknown type +;;(define-extern draw-control object) ;; unknown type +;;(define-extern joint-anim-compressed-frame object) ;; unknown type +;;(define-extern joint-anim-drawable object) ;; unknown type +;;(define-extern joint-anim object) ;; unknown type +(define-extern art-joint-geo type) +;;(define-extern art object) ;; unknown type +;;(define-extern lod-group object) ;; unknown type +;;(define-extern joint-anim-frame object) ;; unknown type +;;(define-extern joint-anim-transformq object) ;; unknown type +;;(define-extern lod-set object) ;; unknown type +;;(define-extern new-dynamic-structure object) ;; unknown type +;;(define-extern generic-pris-mtx-save object) ;; unknown type +;;(define-extern generic-constants object) ;; unknown type +;;(define-extern pris-mtx object) ;; unknown type +;;(define-extern merc-blend-data object) ;; unknown type +;;(define-extern mei-texture-scroll object) ;; unknown type +;;(define-extern merc-extra-info object) ;; unknown type +;;(define-extern merc-vu1-low-mem object) ;; unknown type +;;(define-extern merc-byte-header object) ;; unknown type +;;(define-extern merc-blend-ctrl object) ;; unknown type +;;(define-extern ripple-merc-query object) ;; unknown type +;;(define-extern merc-fragment-control object) ;; unknown type +;;(define-extern mei-ripple object) ;; unknown type +;;(define-extern merc-eye-ctrl object) ;; unknown type +;;(define-extern merc-effect object) ;; unknown type +;;(define-extern ripple-wave object) ;; unknown type +;;(define-extern merc-mat-dest object) ;; unknown type +(define-extern merc-fragment-fp-data function) +(define-extern ripple-wave-set type) +;;(define-extern merc-fragment object) ;; unknown type +;;(define-extern merc-vtx object) ;; unknown type +;;(define-extern merc-eye-anim-block object) ;; unknown type +;;(define-extern merc-fp-header object) ;; unknown type +;;(define-extern merc-ctrl-header object) ;; unknown type +;;(define-extern mei-envmap-tint object) ;; unknown type +(define-extern merc-ctrl type) +;;(define-extern ripple-control object) ;; unknown type +;;(define-extern merc-eye-anim-frame object) ;; unknown type +;;(define-extern merc-matrix object) ;; unknown type +;;(define-extern generic-merc-ctrl object) ;; unknown type +;;(define-extern generic-merc-tag object) ;; unknown type +;;(define-extern generic-merc-output object) ;; unknown type +;;(define-extern generic-merc-input object) ;; unknown type +;;(define-extern generic-merc-work object) ;; unknown type +;;(define-extern generic-merc-dcache object) ;; unknown type +;;(define-extern gm-shadow object) ;; unknown type +;;(define-extern generic-merc-ctrl-with-sfx object) ;; unknown type +;;(define-extern generic-tie-stats object) ;; unknown type +;;(define-extern generic-tie-run-control object) ;; unknown type +;;(define-extern generic-tie-matrix object) ;; unknown type +;;(define-extern generic-tie-interp-point object) ;; unknown type +;;(define-extern generic-tie-input object) ;; unknown type +;;(define-extern generic-tie-control object) ;; unknown type +;;(define-extern generic-tie-bps object) ;; unknown type +;;(define-extern generic-tie-shadow object) ;; unknown type +;;(define-extern generic-tie-work object) ;; unknown type +;;(define-extern generic-tie-instance object) ;; unknown type +;;(define-extern generic-tie-base-point object) ;; unknown type +;;(define-extern generic-tie-header object) ;; unknown type +;;(define-extern generic-tie-ips object) ;; unknown type +;;(define-extern generic-tie-normal object) ;; unknown type +;;(define-extern generic-tie-calls object) ;; unknown type +;;(define-extern generic-texbuf object) ;; unknown type +;;(define-extern generic-debug object) ;; unknown type +;;(define-extern generic-effect-work object) ;; unknown type +;;(define-extern generic-work object) ;; unknown type +;;(define-extern generic-vu1-header object) ;; unknown type +;;(define-extern generic-input-buffer object) ;; unknown type +;;(define-extern generic-effect-buffer object) ;; unknown type +;;(define-extern generic-vu1-texbuf object) ;; unknown type +;;(define-extern *generic-debug* object) ;; unknown type +(define-extern shadow-queue-append function) +;;(define-extern shadow-work object) ;; unknown type +;;(define-extern shadow-queue object) ;; unknown type +;;(define-extern *shadow-queue* object) ;; unknown type +;;(define-extern *shadow* object) ;; unknown type +;;(define-extern shadow-settings object) ;; unknown type +;;(define-extern *shadow-object* object) ;; unknown type +(define-extern shadow-queue-reset function) +;;(define-extern shadow-matrix-ref object) ;; unknown type +;;(define-extern *shadow-debug* object) ;; unknown type +(define-extern shadow-geo type) +;;(define-extern shadow-data object) ;; unknown type +;;(define-extern shadow-vertex object) ;; unknown type +;;(define-extern shadow-tri object) ;; unknown type +;;(define-extern shadow-header object) ;; unknown type +;;(define-extern shadow-run object) ;; unknown type +;;(define-extern shadow-edge object) ;; unknown type +(define-extern shadow-control type) +;;(define-extern mc-file-info object) ;; unknown type +(define-extern show-mc-info function) +;;(define-extern mc-handle object) ;; unknown type +;;(define-extern mc-slot-info object) ;; unknown type +(define-extern mc-sync function) +;;(define-extern mc-run object) ;; unknown type +;;(define-extern mc-get-slot-info object) ;; unknown type +;;(define-extern mc-check-result object) ;; unknown type +(define-extern game-bank type) +;;(define-extern load-state object) ;; unknown type +(define-extern continue-point type) +;;(define-extern *game-info* object) ;; unknown type +(define-extern game-info type) +;;(define-extern level-buffer-state object) ;; unknown type +;;(define-extern actor-id object) ;; unknown type +;;(define-extern *GAME-bank* object) ;; unknown type +;;(define-extern wind-work object) ;; unknown type +(define-extern wind-get-hashed-index function) +;;(define-extern *wind-scales* object) ;; unknown type +;;(define-extern wind-vector object) ;; unknown type +;;(define-extern *wind-work* object) ;; unknown type +(define-extern prototype-bucket-shrub type) +(define-extern prototype-bucket-tie type) +;;(define-extern instance object) ;; unknown type +;;(define-extern prototype-bucket object) ;; unknown type +(define-extern proxy-prototype-array-tie type) +(define-extern prototype-array-tie type) +(define-extern prototype-inline-array-shrub type) +(define-extern prototype-array-shrub-info type) +;;(define-extern joint-control object) ;; unknown type +;;(define-extern channel-upload-info object) ;; unknown type +;;(define-extern joint-control-channel object) ;; unknown type +;;(define-extern matrix-stack object) ;; unknown type +;;(define-extern joint-work object) ;; unknown type +(define-extern invalidate-cache-line function) +;;(define-extern merc-globals object) ;; unknown type +;;(define-extern bone-memory object) ;; unknown type +;;(define-extern bone-work object) ;; unknown type +;;(define-extern shadow-dma-packet object) ;; unknown type +;;(define-extern bone-layout object) ;; unknown type +;;(define-extern bone-debug object) ;; unknown type +;;(define-extern bone-regs object) ;; unknown type +;;(define-extern bone-buffer object) ;; unknown type +;;(define-extern merc-global-array object) ;; unknown type +;;(define-extern *merc-globals* object) ;; unknown type +;;(define-extern *matrix-engine* object) ;; unknown type +;;(define-extern camera-eng object) ;; unknown type +;;(define-extern *camera-engine* object) ;; unknown type +;;(define-extern *background-draw-engine* object) ;; unknown type +;;(define-extern draw object) ;; unknown type +;;(define-extern *debug-engine* object) ;; unknown type +;;(define-extern res-tag object) ;; unknown type +;;(define-extern *res-key-string* object) ;; unknown type +(define-extern res-lump type) +;;(define-extern *res-static-buf* object) ;; unknown type +(define-extern part-group-pointer? function) +(define-extern nav-mesh type) +(define-extern collide-mesh type) +;;(define-extern sinteger object) ;; unknown type +;;(define-extern uinteger object) ;; unknown type +;;(define-extern id object) ;; unknown type +;;(define-extern aid object) ;; unknown type +;;(define-extern interp object) ;; unknown type +;;(define-extern exact object) ;; unknown type +;;(define-extern process-type object) ;; unknown type +;;(define-extern task object) ;; unknown type +;;(define-extern base object) ;; unknown type +;;(define-extern rot object) ;; unknown type +(define-extern vu-lights-default! function) +(define-extern light-group-slerp function) +(define-extern light-slerp function) +(define-extern light-group-process! function) +;;(define-extern *default-lights* object) ;; unknown type +(define-extern vu-lights<-light-group! function) +(define-extern time-to-apex function) +(define-extern time-to-ground function) +;;(define-extern *standard-dynamics* object) ;; unknown type +(define-extern dynamics type) +;;(define-extern standard object) ;; unknown type +;;(define-extern *edge-surface* object) ;; unknown type +;;(define-extern *uppercut-jump-mods* object) ;; unknown type +;;(define-extern *forward-pole-jump-mods* object) ;; unknown type +;;(define-extern *flip-jump-mods* object) ;; unknown type +(define-extern surface-clamp-speed function) +;;(define-extern *flop-mods* object) ;; unknown type +(define-extern surface type) +;;(define-extern *smack-jump-mods* object) ;; unknown type +;;(define-extern *dive-mods* object) ;; unknown type +;;(define-extern *swim-surface* object) ;; unknown type +(define-extern calc-terminal2-vel function) +;;(define-extern *wade-surface* object) ;; unknown type +;;(define-extern *jump-mods* object) ;; unknown type +;;(define-extern *turn-around-mods* object) ;; unknown type +;;(define-extern *jump-attack-mods* object) ;; unknown type +;;(define-extern *grass-surface* object) ;; unknown type +;;(define-extern *dive-bottom-mods* object) ;; unknown type +;;(define-extern *tread-surface* object) ;; unknown type +(define-extern surface-mult! function) +;;(define-extern *forward-high-jump-mods* object) ;; unknown type +;;(define-extern *double-jump-mods* object) ;; unknown type +;;(define-extern edge-grab object) ;; unknown type +;;(define-extern *high-jump-mods* object) ;; unknown type +;;(define-extern *ice-surface* object) ;; unknown type +;;(define-extern *grab-mods* object) ;; unknown type +;;(define-extern *run-attack-mods* object) ;; unknown type +;;(define-extern *quicksand-surface* object) ;; unknown type +;;(define-extern *walk-no-turn-mods* object) ;; unknown type +(define-extern calc-terminal-vel function) +;;(define-extern *duck-mods* object) ;; unknown type +;;(define-extern *duck-attack-mods* object) ;; unknown type +;;(define-extern *slope-surface* object) ;; unknown type +(define-extern calc-terminal4-vel function) +;;(define-extern *edge-grab-mods* object) ;; unknown type +;;(define-extern *standard-ground-surface* object) ;; unknown type +;;(define-extern *flop-land-mods* object) ;; unknown type +;;(define-extern *wheel-mods* object) ;; unknown type +;;(define-extern *swim-mods* object) ;; unknown type +(define-extern surface-interp! function) +;;(define-extern *walk-mods* object) ;; unknown type +;;(define-extern *attack-mods* object) ;; unknown type +;;(define-extern *neutral-mods* object) ;; unknown type +;;(define-extern grab object) ;; unknown type +;;(define-extern *wade-mods* object) ;; unknown type +;;(define-extern *forward-jump-mods* object) ;; unknown type +;;(define-extern *stone-surface* object) ;; unknown type +;;(define-extern *launch-jump-mods* object) ;; unknown type +;;(define-extern *empty-mods* object) ;; unknown type +;;(define-extern *tar-surface* object) ;; unknown type +;;(define-extern *wheel-flip-mods* object) ;; unknown type +;;(define-extern *pole-mods* object) ;; unknown type +;;(define-extern pole object) ;; unknown type +;;(define-extern wheel-flip object) ;; unknown type +;;(define-extern swim-bottom object) ;; unknown type +;;(define-extern empty object) ;; unknown type +;;(define-extern duck object) ;; unknown type +(define-extern wheel type) +;;(define-extern air object) ;; unknown type +;;(define-extern dive object) ;; unknown type +;;(define-extern uppercut object) ;; unknown type +;;(define-extern high-jump object) ;; unknown type +;;(define-extern jump-double object) ;; unknown type +;;(define-extern jump object) ;; unknown type +;;(define-extern swim object) ;; unknown type +;;(define-extern walk object) ;; unknown type +;;(define-extern wade object) ;; unknown type +;;(define-extern attack object) ;; unknown type +;;(define-extern flop object) ;; unknown type +;;(define-extern launch-jump object) ;; unknown type +;;(define-extern run object) ;; unknown type +(define-extern pat-event->string function) +(define-extern pat-material->string function) +;;(define-extern pat-surface object) ;; unknown type +;;(define-extern pat-mode-info object) ;; unknown type +(define-extern pat-mode->string function) +;;(define-extern *pat-mode-info* object) ;; unknown type +;;(define-extern fact-info-target object) ;; unknown type +(define-extern pickup-type->string function) +(define-extern fact-bank type) +(define-extern fact-info type) +;;(define-extern fact-info-enemy object) ;; unknown type +;;(define-extern *FACT-bank* object) ;; unknown type +;;(define-extern cam-vert object) ;; unknown type +;;(define-extern idle-distance object) ;; unknown type +;;(define-extern options object) ;; unknown type +;;(define-extern notice-top object) ;; unknown type +;;(define-extern speed object) ;; unknown type +;;(define-extern cam-notice-dist object) ;; unknown type +;;(define-extern process-drawable-art-error object) ;; unknown type +;;(define-extern notice-bottom object) ;; unknown type +;;(define-extern eco-info object) ;; unknown type +;;(define-extern cam-horz object) ;; unknown type +;;(define-extern timeout object) ;; unknown type +;;(define-extern align-control object) ;; unknown type +;;(define-extern attack-info object) ;; unknown type +;;(define-extern process-drawable object) ;; unknown type +;;(define-extern *global-attack-id* object) ;; unknown type +;;(define-extern ground-tween-info object) ;; unknown type +;;(define-extern process-drawable-reserved object) ;; unknown type +;;(define-extern othercam object) ;; unknown type +;;(define-extern process-hidden object) ;; unknown type +;;(define-extern gui-query object) ;; unknown type +;;(define-extern manipy object) ;; unknown type +;;(define-extern camera-tracker object) ;; unknown type +(define-extern swingpole type) +;;(define-extern part-spawner object) ;; unknown type +;;(define-extern touch-tracker object) ;; unknown type +;;(define-extern part-tracker object) ;; unknown type +;;(define-extern pov-camera object) ;; unknown type +;;(define-extern delayed-rand-float object) ;; unknown type +;;(define-extern sync-info-paused object) ;; unknown type +;;(define-extern bouncing-float object) ;; unknown type +;;(define-extern delayed-rand-vector object) ;; unknown type +;;(define-extern sync-info object) ;; unknown type +;;(define-extern oscillating-vector object) ;; unknown type +;;(define-extern sync-info-eased object) ;; unknown type +;;(define-extern oscillating-float object) ;; unknown type +;;(define-extern smush-control object) ;; unknown type +;;(define-extern trajectory object) ;; unknown type +;;(define-extern debug-vertex-stats object) ;; unknown type +;;(define-extern debug-vertex object) ;; unknown type +;;(define-extern pos-history object) ;; unknown type +;;(define-extern joint-mod-wheel object) ;; unknown type +;;(define-extern joint-mod object) ;; unknown type +;;(define-extern joint-mod-set-local object) ;; unknown type +(define-extern joint-mod-set-local-callback function) +(define-extern joint-mod-blend-local-callback function) +;;(define-extern try-to-look-at-info object) ;; unknown type +(define-extern joint-mod-look-at-handler function) +(define-extern joint-mod-set-world-callback function) +;;(define-extern last-try-to-look-at-data object) ;; unknown type +;;(define-extern *joint-axis-vectors* object) ;; unknown type +;;(define-extern joint-mod-set-world object) ;; unknown type +(define-extern joint-mod-wheel-callback function) +(define-extern joint-mod-spinner-callback function) +(define-extern joint-mod-joint-set-handler function) +;;(define-extern joint-mod-spinner object) ;; unknown type +(define-extern joint-mod-debug-draw function) +;;(define-extern joint-mod-blend-local object) ;; unknown type +(define-extern joint-mod-world-look-at-handler function) +(define-extern joint-mod-rotate-handler function) +(define-extern joint-mod-joint-set*-handler function) +(define-extern add-debug-matrix function) +(define-extern vector<-cspace! function) +(define-extern cspace<-transformq! function) +(define-extern add-debug-text-sphere function) +;;(define-extern attacking object) ;; unknown type +;;(define-extern force object) ;; unknown type +(define-extern cspace<-parented-transformq-joint! function) +;;(define-extern target object) ;; unknown type +;;(define-extern collide-mesh-tri object) ;; unknown type +;;(define-extern *collide-mesh-cache* object) ;; unknown type +;;(define-extern collide-mesh-cache-tri object) ;; unknown type +;;(define-extern collide-mesh-cache object) ;; unknown type +;;(define-extern collide-tri-result object) ;; unknown type +;;(define-extern collide-player-list object) ;; unknown type +;;(define-extern collide-shape-moving object) ;; unknown type +;;(define-extern collide-shape-prim object) ;; unknown type +;;(define-extern *collide-usually-hit-by-player-list* object) ;; unknown type +(define-extern collide-shape-prim-mesh type) +;;(define-extern collide-shape-intersect object) ;; unknown type +;;(define-extern collide-hit-by-others-list object) ;; unknown type +;;(define-extern *collide-shape-prim-water* object) ;; unknown type +;;(define-extern *collide-player-list* object) ;; unknown type +;;(define-extern collide-shape-prim-sphere object) ;; unknown type +;;(define-extern collide-sticky-rider-group object) ;; unknown type +;;(define-extern collide-sticky-rider object) ;; unknown type +;;(define-extern *collide-shape-prim-backgnd* object) ;; unknown type +;;(define-extern collide-usually-hit-by-player-list object) ;; unknown type +;;(define-extern collide-prim-core object) ;; unknown type +;;(define-extern collide-shape-prim-group object) ;; unknown type +;;(define-extern pull-rider-info object) ;; unknown type +;;(define-extern collide-hit-by-player-list object) ;; unknown type +;;(define-extern collide-overlap-result object) ;; unknown type +;;(define-extern *collide-hit-by-others-list* object) ;; unknown type +;;(define-extern *collide-hit-by-player-list* object) ;; unknown type +;;(define-extern collide-shape object) ;; unknown type +;;(define-extern overlaps-others-params object) ;; unknown type +;;(define-extern camera object) ;; unknown type +;;(define-extern control-info object) ;; unknown type +;;(define-extern collide-history object) ;; unknown type +;;(define-extern touching-list object) ;; unknown type +;;(define-extern touching-shapes-entry object) ;; unknown type +;;(define-extern *touching-prims-entry-pool* object) ;; unknown type +;;(define-extern touching-prims-entry object) ;; unknown type +;;(define-extern touching-prims-entry-pool object) ;; unknown type +;;(define-extern *touching-list* object) ;; unknown type +;;(define-extern touching-prim object) ;; unknown type +;;(define-extern collide-edge-tri object) ;; unknown type +;;(define-extern *edge-grab-info* object) ;; unknown type +;;(define-extern collide-edge-edge object) ;; unknown type +;;(define-extern edge-grab-info object) ;; unknown type +;;(define-extern collide-edge-hold-list object) ;; unknown type +;;(define-extern collide-edge-work object) ;; unknown type +;;(define-extern *collide-edge-work* object) ;; unknown type +;;(define-extern collide-edge-hold-item object) ;; unknown type +(define-extern num-func-seek! function) +(define-extern cspace-index-by-name-no-fail function) +(define-extern num-func-blend-in! function) +(define-extern num-func-chan function) +(define-extern num-func-none function) +(define-extern num-func--! function) +(define-extern cspace-by-name-no-fail function) +(define-extern num-func-identity function) +(define-extern num-func-+! function) +(define-extern num-func-loop! function) +(define-extern cspace-by-name function) +(define-extern cspace-index-by-name function) +(define-extern joint-control-reset! function) +;;(define-extern effect-control object) ;; unknown type +;;(define-extern effect-name object) ;; unknown type +(define-extern drawable-inline-array-collide-fragment type) +(define-extern collide-frag-mesh type) +(define-extern collide-fragment type) +;;(define-extern collide-frag-vertex object) ;; unknown type +(define-extern drawable-tree-collide-fragment type) +;;(define-extern projectile-blue object) ;; unknown type +;;(define-extern projectile-yellow object) ;; unknown type +;;(define-extern projectile object) ;; unknown type +;;(define-extern *sidekick* object) ;; unknown type +;;(define-extern *target* object) ;; unknown type +;;(define-extern sidekick object) ;; unknown type +;;(define-extern depth-cue-work object) ;; unknown type +;;(define-extern depth-cue-data object) ;; unknown type +;;(define-extern perf-stat-array object) ;; unknown type +;;(define-extern perf-stat object) ;; unknown type +;;(define-extern tr-stat object) ;; unknown type +;;(define-extern merc-global-stats object) ;; unknown type +(define-extern bsp-header type) +;;(define-extern game-level object) ;; unknown type +(define-extern inspect-bsp-tree function) +(define-extern map-bsp-tree function) +;;(define-extern cl-stat object) ;; unknown type +;;(define-extern bsp-node object) ;; unknown type +;;(define-extern view-frustum object) ;; unknown type +;;(define-extern collide-stats object) ;; unknown type +;;(define-extern collide-cache-tri object) ;; unknown type +;;(define-extern *collide-cache* object) ;; unknown type +;;(define-extern collide-list-item object) ;; unknown type +;;(define-extern *collide-work* object) ;; unknown type +;;(define-extern collide-using-spheres-params object) ;; unknown type +;;(define-extern collide-puss-work object) ;; unknown type +;;(define-extern collide-puss-sphere object) ;; unknown type +;;(define-extern collide-puyp-work object) ;; unknown type +;;(define-extern *collide-list* object) ;; unknown type +;;(define-extern collide-work object) ;; unknown type +;;(define-extern collide-cache-prim object) ;; unknown type +;;(define-extern collide-list object) ;; unknown type +;;(define-extern collide-cache object) ;; unknown type +;;(define-extern *collide-test-flag* object) ;; unknown type +;;(define-extern *shrub-state* object) ;; unknown type +(define-extern generic-shrub-fragment type) +(define-extern instance-shrubbery type) +(define-extern shrubbery-login-post-texture function) +(define-extern shrubbery type) +(define-extern drawable-inline-array-instance-shrub type) +;;(define-extern instance-shrub-dma object) ;; unknown type +(define-extern drawable-tree-instance-shrub type) +;;(define-extern shrub-near-packet object) ;; unknown type +(define-extern billboard type) +(define-extern prototype-generic-shrub type) +;;(define-extern instance-shrub-work object) ;; unknown type +(define-extern prototype-trans-shrubbery type) +(define-extern prototype-shrubbery type) +;;(define-extern shrub-view-data object) ;; unknown type +;;(define-extern shrubbery-matrix object) ;; unknown type +(define-extern drawable-tree-instance-tie type) +(define-extern prototype-tie type) +;;(define-extern prototype-tie-work object) ;; unknown type +;;(define-extern prototype-tie-dma object) ;; unknown type +(define-extern drawable-inline-array-instance-tie type) +(define-extern tie-fragment type) +;;(define-extern instance-tie-dma object) ;; unknown type +;;(define-extern tie-matrix object) ;; unknown type +(define-extern instance-tie type) +;;(define-extern instance-tie-work object) ;; unknown type +;;(define-extern *instance-tie-work-copy* object) ;; unknown type +(define-extern drawable-tree-dirt-tfrag type) +(define-extern drawable-inline-array-trans-tfrag type) +(define-extern drawable-tree-ice-tfrag type) +;;(define-extern generic-tfragment object) ;; unknown type +(define-extern drawable-tree-lowres-tfrag type) +(define-extern drawable-tree-tfrag type) +(define-extern tfragment type) +;;(define-extern drawable-tree-lowres-trans-tfrag object) ;; unknown type +(define-extern drawable-tree-trans-tfrag type) +;;(define-extern tfragment-stats object) ;; unknown type +;;(define-extern tfrag-control object) ;; unknown type +;;(define-extern tfrag-stats object) ;; unknown type +(define-extern drawable-inline-array-tfrag type) +;;(define-extern tfrag-packet object) ;; unknown type +;;(define-extern tfrag-work object) ;; unknown type +;;(define-extern tfrag-dma object) ;; unknown type +;;(define-extern tfrag-data object) ;; unknown type +;;(define-extern tfragment-debug-data object) ;; unknown type +;;(define-extern tfrag-dists object) ;; unknown type +;;(define-extern background-work object) ;; unknown type +;;(define-extern subdivide-dists object) ;; unknown type +;;(define-extern work-area object) ;; unknown type +;;(define-extern subdivide-settings object) ;; unknown type +;;(define-extern terrain-bsp object) ;; unknown type +;;(define-extern gs-packed-stq object) ;; unknown type +;;(define-extern terrain-context object) ;; unknown type +;;(define-extern foreground-area object) ;; unknown type +;;(define-extern gs-packed-xyzw object) ;; unknown type +;;(define-extern gs-packed-gt4 object) ;; unknown type +;;(define-extern dma-area object) ;; unknown type +;;(define-extern background-area object) ;; unknown type +;;(define-extern *collide-stats* object) ;; unknown type +;;(define-extern ambient-area object) ;; unknown type +;;(define-extern terrain-stats object) ;; unknown type +;;(define-extern *terrain-stats* object) ;; unknown type +;;(define-extern gs-packed-rgba object) ;; unknown type +;;(define-extern gs-packed-gt object) ;; unknown type +;;(define-extern *generate-actor-vis-start* object) ;; unknown type +;;(define-extern *ACTOR-bank* object) ;; unknown type +(define-extern entity-actor type) +(define-extern entity-camera type) +;;(define-extern entity-perm-array object) ;; unknown type +;;(define-extern entity-links-array object) ;; unknown type +(define-extern entity-nav-login function) +(define-extern entity-ambient type) +;;(define-extern *generate-actor-vis-output* object) ;; unknown type +;;(define-extern entity-links object) ;; unknown type +;;(define-extern *generate-actor-vis* object) ;; unknown type +(define-extern entity-info type) +;;(define-extern entity object) ;; unknown type +;;(define-extern entity-perm object) ;; unknown type +;;(define-extern entity-ambient-data-array object) ;; unknown type +;;(define-extern entity-ambient-data object) ;; unknown type +(define-extern actor-bank type) +;;(define-extern sprite-array-3d object) ;; unknown type +;;(define-extern sprite-array-2d object) ;; unknown type +;;(define-extern sprite-vec-data-3d object) ;; unknown type +;;(define-extern sprite-vec-data-2d object) ;; unknown type +;;(define-extern fake-shadow-buffer object) ;; unknown type +;;(define-extern fake-shadow object) ;; unknown type +;;(define-extern *fake-shadow-buffer-1* object) ;; unknown type +;;(define-extern *fake-shadow-buffer* object) ;; unknown type +;;(define-extern *fake-shadow-buffer-2* object) ;; unknown type +(define-extern eye-control-array type) +;;(define-extern *eye-control-array* object) ;; unknown type +;;(define-extern eye object) ;; unknown type +;;(define-extern eye-work object) ;; unknown type +;;(define-extern eye-control object) ;; unknown type +;;(define-extern sp-field-init-spec object) ;; unknown type +(define-extern sparticle-launcher type) +(define-extern sparticle-launch-group type) +;;(define-extern sparticle-group-item object) ;; unknown type +;;(define-extern sparticle-launch-control object) ;; unknown type +;;(define-extern sparticle-launch-state object) ;; unknown type +;;(define-extern sparticle-system object) ;; unknown type +;;(define-extern *sp-60-hz* object) ;; unknown type +;;(define-extern *sp-frame-time* object) ;; unknown type +;;(define-extern sparticle-cpuinfo object) ;; unknown type +;;(define-extern sparticle-launchinfo object) ;; unknown type +(define-extern actor-link-subtask-complete-hook function) +(define-extern actor-link-dead-hook function) +(define-extern entity-actor-count function) +(define-extern alt-actor-list-subtask-incomplete-count function) +(define-extern entity-actor-lookup function) +;;(define-extern actor-link-info object) ;; unknown type +;;(define-extern next-actor object) ;; unknown type +;;(define-extern alt-actor object) ;; unknown type +(define-extern entity-by-name function) +(define-extern entity-by-aid function) +;;(define-extern prev-actor object) ;; unknown type +;;(define-extern cam-index object) ;; unknown type +;;(define-extern cam-vector-seeker object) ;; unknown type +;;(define-extern tracking-point object) ;; unknown type +;;(define-extern cam-float-seeker object) ;; unknown type +;;(define-extern camera-master object) ;; unknown type +;;(define-extern tracking-spline object) ;; unknown type +;;(define-extern camera-combiner object) ;; unknown type +;;(define-extern camera-slave object) ;; unknown type +(define-extern camera-bank type) +;;(define-extern tracking-spline-sampler object) ;; unknown type +;;(define-extern cam-rotation-tracker object) ;; unknown type +;;(define-extern *CAMERA-bank* object) ;; unknown type +;;(define-extern *greenline-table* object) ;; unknown type +;;(define-extern *timeplot-index* object) ;; unknown type +(define-extern float-lookup-greenline function) +;;(define-extern *greenline-index* object) ;; unknown type +(define-extern float-lookup-yellowline function) +(define-extern float-save-redline function) +(define-extern float-lookup-redline function) +;;(define-extern *blueline-table* object) ;; unknown type +;;(define-extern *timeplot-table* object) ;; unknown type +(define-extern float-save-greenline function) +(define-extern float-lookup-blueline function) +(define-extern float-save-blueline function) +(define-extern float-lookup-timeplot function) +;;(define-extern *redline-index* object) ;; unknown type +;;(define-extern *cam-layout* object) ;; unknown type +;;(define-extern *blueline-index* object) ;; unknown type +;;(define-extern *yellowline-table* object) ;; unknown type +(define-extern float-save-yellowline function) +;;(define-extern *yellowline-index* object) ;; unknown type +(define-extern float-save-timeplot function) +;;(define-extern *redline-table* object) ;; unknown type +;;(define-extern *camera-init-mat* object) ;; unknown type +;;(define-extern *camera-orbit-target* object) ;; unknown type +;;(define-extern *camera-combiner* object) ;; unknown type +;;(define-extern *camera-read-analog* object) ;; unknown type +;;(define-extern *camera* object) ;; unknown type +;;(define-extern *camera-read-buttons* object) ;; unknown type +;;(define-extern *cam-free-move-along-z* object) ;; unknown type +;;(define-extern *camera-other-trans* object) ;; unknown type +;;(define-extern *camera-other-root* object) ;; unknown type +;;(define-extern *camera-look-through-other* object) ;; unknown type +;;(define-extern *camera-other-fov* object) ;; unknown type +;;(define-extern *camera-other-matrix* object) ;; unknown type +;;(define-extern *camera-smush-control* object) ;; unknown type +;;(define-extern *external-cam-options* object) ;; unknown type +;;(define-extern *external-cam-mode* object) ;; unknown type +;;(define-extern __assert-info-private-struct object) ;; unknown type +;;(define-extern *__private-assert-info* object) ;; unknown type +(define-extern hud-icon type) +(define-extern hud-particle type) +;;(define-extern hud-parts object) ;; unknown type +;;(define-extern hud object) ;; unknown type +;;(define-extern *hud-parts* object) ;; unknown type +(define-extern game-option type) +;;(define-extern progress object) ;; unknown type +;;(define-extern *progress-process* object) ;; unknown type +;;(define-extern count-info object) ;; unknown type +(define-extern task-info-data type) +(define-extern game-count-info type) +;;(define-extern *progress-last-task-index* object) ;; unknown type +(define-extern level-tasks-info type) +;;(define-extern rpc-buffer object) ;; unknown type +;;(define-extern rpc-buffer-pair object) ;; unknown type +;;(define-extern rpc-busy? object) ;; unknown type +;;(define-extern rpc-call object) ;; unknown type +;;(define-extern curve-control object) ;; unknown type +;;(define-extern path-control object) ;; unknown type +;;(define-extern path-k object) ;; unknown type +;;(define-extern path-actor object) ;; unknown type +;;(define-extern path object) ;; unknown type +;;(define-extern string->symbol object) ;; unknown type +;;(define-extern nav-ray object) ;; unknown type +(define-extern nav-mesh-connect function) +;;(define-extern nav-poly object) ;; unknown type +;;(define-extern check-vector-collision-with-nav-spheres-info object) ;; unknown type +;;(define-extern nav-control object) ;; unknown type +;;(define-extern nav-gap-info object) ;; unknown type +;;(define-extern nav-node object) ;; unknown type +;;(define-extern nav-vertex object) ;; unknown type +;;(define-extern clip-travel-vector-to-mesh-return-info object) ;; unknown type +;;(define-extern nav-route-portal object) ;; unknown type +(define-extern has-nav-mesh? function) +;;(define-extern nav-sphere object) ;; unknown type +;;(define-extern nav-lookup-elem object) ;; unknown type +;;(define-extern nav-mesh-actor object) ;; unknown type +;;(define-extern *default-nav-mesh* object) ;; unknown type +;;(define-extern process-level-heap object) ;; unknown type +;;(define-extern nav-max-users object) ;; unknown type +;;(define-extern nav-engine object) ;; unknown type +;;(define-extern nearest-y-threshold object) ;; unknown type +(define-extern dgo-load-begin function) +(define-extern dgo-load-continue function) +(define-extern destroy-mem function) +(define-extern str-load function) +;;(define-extern *load-str-rpc* object) ;; unknown type +;;(define-extern load-chunk-msg object) ;; unknown type +;;(define-extern *dgo-name* object) ;; unknown type +(define-extern str-ambient-play function) +;;(define-extern *load-str-lock* object) ;; unknown type +(define-extern str-load-status function) +(define-extern str-load-cancel function) +(define-extern str-play-queue function) +(define-extern str-ambient-stop function) +(define-extern dgo-load-get-next function) +(define-extern find-temp-buffer function) +(define-extern str-play-kick function) +;;(define-extern load-dgo-msg object) ;; unknown type +;;(define-extern *load-dgo-rpc* object) ;; unknown type +;;(define-extern *que-str-lock* object) ;; unknown type +(define-extern dgo-load-cancel function) +(define-extern dgo-load-link function) +;;(define-extern *dgo-time* object) ;; unknown type +;;(define-extern dgo-header object) ;; unknown type +(define-extern str-play-async function) +(define-extern str-play-stop function) +;;(define-extern *play-str-rpc* object) ;; unknown type +(define-extern string->sound-name function) +;;(define-extern complete object) ;; unknown type +;;(define-extern busy object) ;; unknown type +;;(define-extern link-begin object) ;; unknown type +;;(define-extern *current-ramdisk-id* object) ;; unknown type +;;(define-extern ramdisk-rpc-load object) ;; unknown type +(define-extern ramdisk-load function) +;;(define-extern ramdisk-rpc-load-to-ee object) ;; unknown type +;;(define-extern *ramdisk-rpc* object) ;; unknown type +(define-extern ramdisk-sync function) +;;(define-extern ramdisk-rpc-fill object) ;; unknown type +(define-extern swap-sound-buffers function) +;;(define-extern misty object) ;; unknown type +(define-extern sound-group-stop function) +(define-extern sound-set-ear-trans function) +(define-extern sound-pause function) +(define-extern is-cd-in? function) +(define-extern sound-play-by-spec function) +;;(define-extern *sound-iop-info* object) ;; unknown type +(define-extern check-irx-version function) +(define-extern str-is-playing? function) +(define-extern free-last-sound-buffer-entry function) +(define-extern sound-volume-off function) +;;(define-extern *sound-player-rpc* object) ;; unknown type +;;(define-extern *sound-loader-rpc* object) ;; unknown type +;;(define-extern *flava-table* object) ;; unknown type +(define-extern sound-basic-cb function) +;;(define-extern sound-iop-info object) ;; unknown type +;;(define-extern beach object) ;; unknown type +;;(define-extern flava-table object) ;; unknown type +;;(define-extern empty2 object) ;; unknown type +(define-extern sound-bank-unload function) +(define-extern sound-stop function) +(define-extern get-sound-buffer-entry function) +(define-extern current-str-pos function) +(define-extern sound-play-by-name function) +;;(define-extern jungleb object) ;; unknown type +;;(define-extern snow object) ;; unknown type +;;(define-extern rolling object) ;; unknown type +(define-extern sound-set-falloff-curve function) +;;(define-extern jungle object) ;; unknown type +(define-extern sound-name= function) +(define-extern new-sound-id function) +(define-extern sound-set-reverb function) +(define-extern list-sounds function) +(define-extern show-iop-info function) +(define-extern sound-music-load function) +;;(define-extern finalboss object) ;; unknown type +(define-extern sound-trans-convert function) +(define-extern sound-set-sound-falloff function) +;;(define-extern flava-table-row object) ;; unknown type +;;(define-extern swamp object) ;; unknown type +;;(define-extern village1 object) ;; unknown type +(define-extern sound-group-continue function) +;;(define-extern village2 object) ;; unknown type +(define-extern sound-continue function) +;;(define-extern empty1 object) ;; unknown type +;;(define-extern village3 object) ;; unknown type +;;(define-extern *sound-player-enable* object) ;; unknown type +;;(define-extern firecanyon object) ;; unknown type +;;(define-extern citadel object) ;; unknown type +(define-extern show-iop-memory function) +(define-extern sound-set-volume function) +(define-extern sound-command->string function) +(define-extern make-sqrt-table function) +(define-extern flava-lookup function) +(define-extern sound-music-unload function) +;;(define-extern *ambient-spec* object) ;; unknown type +(define-extern sound-angle-convert function) +(define-extern ear-trans function) +;;(define-extern ogre object) ;; unknown type +;;(define-extern maincave object) ;; unknown type +;;(define-extern credits object) ;; unknown type +(define-extern sound-bank-load function) +;;(define-extern lavatube object) ;; unknown type +(define-extern sound-group-pause function) +(define-extern current-str-id function) +(define-extern sound-set-flava function) +(define-extern sound-buffer-dump function) +(define-extern sound-reload-info function) +(define-extern set-language function) +;;(define-extern *debug-effect-control* object) ;; unknown type +(define-extern math-camera-pos function) +;;(define-extern kset-language object) ;; unknown type +;;(define-extern effect-param object) ;; unknown type +;;(define-extern cycle-speed object) ;; unknown type +;;(define-extern *setting-control* object) ;; unknown type +(define-extern effect-param->sound-spec function) +;;(define-extern sfx-volume object) ;; unknown type +(define-extern target-pos function) +;;(define-extern music-volume object) ;; unknown type +(define-extern activate-progress function) +(define-extern camera-pos function) +;;(define-extern ambient-volume object) ;; unknown type +(define-extern matrix<-transformq+trans! function) +(define-extern matrix<-transformq+world-trans! function) +(define-extern matrix<-no-trans-transformq! function) +(define-extern transformq-copy! function) +(define-extern matrix<-parented-transformq! function) +(define-extern matrix<-transformq! function) +(define-extern moving-sphere-triangle-intersect function) +(define-extern ray-circle-intersect function) +(define-extern moving-sphere-moving-sphere-intersect function) +(define-extern ray-sphere-intersect function) +(define-extern raw-ray-sphere-intersect function) +(define-extern collide-do-primitives function) +(define-extern ray-triangle-intersect function) +(define-extern ray-plane-intersect function) +(define-extern ray-cylinder-intersect function) +(define-extern moving-sphere-sphere-intersect function) +(define-extern joint-control-channel-eval function) +(define-extern cspace<-transform-yxy! function) +(define-extern decompress-frame-data-to-accumulator function) +(define-extern matrix-from-joint-anim-frame function) +(define-extern matrix-from-control-pair! function) +(define-extern cspace<-cspace! function) +(define-extern cspace<-matrix-no-push-joint! function) +(define-extern jacc-mem-usage function) +(define-extern normalize-frame-quaternions function) +(define-extern joint-control-channel-eval! function) +(define-extern joint-anim-login function) +(define-extern joint-control-copy! function) +(define-extern matrix-from-control! function) +(define-extern cspace<-rot-yxy! function) +(define-extern cspace<-transformq+trans! function) +(define-extern joint-control-channel-group! function) +(define-extern joint-control-remap! function) +(define-extern cspace<-matrix-joint! function) +(define-extern calc-animation-from-spr function) +(define-extern decompress-fixed-data-to-accumulator function) +(define-extern cspace<-transformq+world-trans! function) +(define-extern cspace-calc-total-matrix! function) +(define-extern create-interpolated-joint-animation-frame function) +(define-extern matrix-from-control-channel! function) +(define-extern joint-anim-inspect-elt function) +(define-extern clear-frame-accumulator function) +(define-extern joint-control-channel-group-eval! function) +(define-extern flatten-joint-control-to-spr function) +(define-extern cspace<-parented-matrix-joint! function) +(define-extern make-joint-jump-tables function) +(define-extern decompress-frame-data-pair-to-accumulator function) +;;(define-extern stack object) ;; unknown type +;;(define-extern push1 object) ;; unknown type +(define-extern mem-size function) +;;(define-extern blend object) ;; unknown type +;;(define-extern push object) ;; unknown type +;;(define-extern stack1 object) ;; unknown type +;;(define-extern no-push object) ;; unknown type +;;(define-extern cylinder-verts object) ;; unknown type +;;(define-extern cylinder-flat-verts object) ;; unknown type +(define-extern ray-arbitrary-circle-intersect function) +(define-extern camera-line function) +(define-extern update-wind function) +(define-extern print-collide-stats function) +(define-extern mem-usage-bsp-tree function) +;;(define-extern *test-shrub* object) ;; unknown type +(define-extern clear-cl-stat function) +(define-extern bsp-camera-asm function) +(define-extern print-cl-stat function) +(define-extern update-subdivide-settings! function) +(define-extern foreground-engine-execute function) +;;(define-extern *subdivide-settings* object) ;; unknown type +;;(define-extern *stat-string-tfrag-near* object) ;; unknown type +(define-extern print-tr-stat function) +;;(define-extern *stat-string-total* object) ;; unknown type +;;(define-extern *perf-stats* object) ;; unknown type +(define-extern perf-stat-bucket->string function) +;;(define-extern GSH_ENABLE object) ;; unknown type +(define-extern print-terrain-stats function) +(define-extern start-perf-stat-collection function) +;;(define-extern GSH_WHICH_STAT object) ;; unknown type +;;(define-extern *merc-global-stats* object) ;; unknown type +;;(define-extern GSH_TIME object) ;; unknown type +(define-extern print-perf-stats function) +;;(define-extern *gomi-stats-hack* object) ;; unknown type +(define-extern clear-tr-stat function) +;;(define-extern GSH_MAX_DISPLAY object) ;; unknown type +;;(define-extern *terrain-context* object) ;; unknown type +;;(define-extern GSH_BUCKET object) ;; unknown type +(define-extern end-perf-stat-collection function) +;;(define-extern *stat-string-tfrag* object) ;; unknown type +(define-extern set-tfrag-dists! function) +;;(define-extern *tfrag-work* object) ;; unknown type +(define-extern sprite-add-frame-data function) +;;(define-extern *sprite-hvdf-control* object) ;; unknown type +;;(define-extern *sprite-aux-list* object) ;; unknown type +;;(define-extern sprite-aux-list object) ;; unknown type +(define-extern clear-sprite-aux-list function) +;;(define-extern sprite-hvdf-data object) ;; unknown type +(define-extern sprite-draw function) +(define-extern add-to-sprite-aux-list function) +;;(define-extern sprite-hvdf-control object) ;; unknown type +;;(define-extern sprite-vu1-block object) ;; unknown type +(define-extern sprite-add-2d-all function) +(define-extern sprite-add-2d-chunk function) +(define-extern sprite-setup-header function) +;;(define-extern *sprite-hvdf-data* object) ;; unknown type +(define-extern sprite-release-user-hvdf function) +;;(define-extern *sprite-array-3d* object) ;; unknown type +;;(define-extern sprite-frame-data object) ;; unknown type +(define-extern sprite-add-matrix-data function) +(define-extern sprite-get-user-hvdf function) +(define-extern sprite-add-3d-all function) +(define-extern sprite-get-3d-quaternion! function) +(define-extern sprite-set-3d-quaternion! function) +(define-extern sprite-add-shadow-all function) +(define-extern sprite-add-3d-chunk function) +;;(define-extern sprite-header object) ;; unknown type +(define-extern sprite-add-shadow-chunk function) +(define-extern sprite-setup-frame-data function) +;;(define-extern *sprite-array-2d* object) ;; unknown type +(define-extern sprite-allocate-user-hvdf function) +(define-extern sprite-draw-distorters function) +;;(define-extern *shadow-middot-texture* object) ;; unknown type +(define-extern sprite-init-distorter function) +;;(define-extern sprite-distorter-sine-tables object) ;; unknown type +;;(define-extern *sprite-distorter-sine-tables* object) ;; unknown type +;;(define-extern sprite-distort-vu1-block object) ;; unknown type +(define-extern make-debug-sphere-table function) +;;(define-extern *debug-sphere-table* object) ;; unknown type +(define-extern add-debug-sphere-from-table function) +(define-extern debug-sphere-table type) +(define-extern add-debug-line function) +(define-extern internal-draw-debug-text-3d function) +;;(define-extern debug-tracking-thang object) ;; unknown type +(define-extern add-debug-curve2 function) +(define-extern history-init function) +(define-extern debug-draw-buffers function) +(define-extern display-file-info function) +(define-extern add-debug-sphere function) +(define-extern add-debug-outline-triangle function) +(define-extern add-debug-x function) +(define-extern add-debug-points function) +(define-extern add-debug-text-3d function) +(define-extern add-debug-vector function) +(define-extern transform-float-point function) +(define-extern add-debug-curve function) +;;(define-extern debug-line object) ;; unknown type +;;(define-extern *debug-lines* object) ;; unknown type +;;(define-extern *debug-lines-trk* object) ;; unknown type +(define-extern add-debug-spheres function) +(define-extern debug-percent-bar function) +(define-extern history-draw-and-update function) +(define-extern add-debug-light function) +(define-extern add-debug-point function) +(define-extern debug-reset-buffers function) +(define-extern debug-pad-display function) +;;(define-extern *debug-text-3ds* object) ;; unknown type +(define-extern internal-draw-debug-line function) +;;(define-extern debug-text-3d object) ;; unknown type +(define-extern add-debug-circle function) +(define-extern add-debug-sphere-with-transform function) +;;(define-extern *debug-text-3d-trk* object) ;; unknown type +(define-extern add-debug-rot-matrix function) +(define-extern add-debug-lights function) +(define-extern drawable-frag-count function) +(define-extern get-debug-text-3d function) +(define-extern add-debug-arc function) +(define-extern add-debug-triangle-normal function) +(define-extern add-debug-yrot-vector function) +(define-extern dma-timeout-cam function) +(define-extern add-debug-box function) +(define-extern add-debug-flat-triangle function) +(define-extern get-debug-line function) +(define-extern add-debug-line2d function) +;;(define-extern menu object) ;; unknown type +;;(define-extern fade-depth object) ;; unknown type +;;(define-extern fade object) ;; unknown type +(define-extern draw-string function) +(define-extern debug-set-camera-pos-rot! function) +;;(define-extern merc-vu1-block object) ;; unknown type +(define-extern setup-blerc-chains-for-one-fragment function) +(define-extern dma-from-spr function) +;;(define-extern blerc-block object) ;; unknown type +(define-extern blerc-a-fragment function) +(define-extern merc-blend-shape function) +(define-extern setup-blerc-chains function) +(define-extern blerc-execute function) +;;(define-extern *stats-blerc* object) ;; unknown type +(define-extern blerc-stats-init function) +;;(define-extern blerc-globals object) ;; unknown type +(define-extern merc-dma-chain-to-spr function) +(define-extern blerc-init function) +;;(define-extern blerc-block-header object) ;; unknown type +;;(define-extern blerc-dcache object) ;; unknown type +;;(define-extern blerc-context object) ;; unknown type +;;(define-extern *blerc-globals* object) ;; unknown type +(define-extern merc-edge-stats function) +;;(define-extern *merc-ctrl-header* object) ;; unknown type +(define-extern merc-vu1-initialize-chain function) +(define-extern merc-vu1-add-vu-function function) +(define-extern merc-vu1-init-buffers function) +(define-extern merc-vu1-init-buffer function) +(define-extern merc-stats function) +(define-extern merc-stats-display function) +(define-extern get-eye-block function) +(define-extern ripple-execute-init function) +;;(define-extern *ripple-globals* object) ;; unknown type +(define-extern ripple-slow-add-sine-waves function) +;;(define-extern ripple-request object) ;; unknown type +(define-extern ripple-apply-wave-table function) +(define-extern ripple-find-height function) +(define-extern ripple-matrix-scale function) +(define-extern ripple-add-debug-sphere function) +(define-extern ripple-execute function) +(define-extern ripple-update-waveform-offs function) +(define-extern ripple-create-wave-table function) +(define-extern ripple-make-request function) +;;(define-extern ripple-globals object) ;; unknown type +(define-extern dump-qword function) +(define-extern bones-reset-sqwc function) +;;(define-extern bone-calculation-list object) ;; unknown type +;;(define-extern *use-generic* object) ;; unknown type +(define-extern bone-list-init function) +(define-extern draw-bones-check-longest-edge function) +(define-extern texscroll-execute function) +(define-extern bones-init function) +;;(define-extern merc-effect-bucket-info object) ;; unknown type +;;(define-extern *default-shadow-settings* object) ;; unknown type +;;(define-extern *merc-bucket-info* object) ;; unknown type +;;(define-extern *bone-calculation-list* object) ;; unknown type +(define-extern bones-set-sqwc function) +;;(define-extern *bones-first* object) ;; unknown type +(define-extern draw-bones-mtx-calc function) +(define-extern draw-bones-generic-merc function) +(define-extern draw-bones function) +;;(define-extern merc-bucket-info object) ;; unknown type +;;(define-extern *merc-global-array* object) ;; unknown type +(define-extern draw-bones-merc function) +;;(define-extern bones-vu0-block object) ;; unknown type +(define-extern texscroll-make-request function) +(define-extern draw-bones-check-longest-edge-asm function) +(define-extern bones-mtx-calc-execute function) +;;(define-extern *texscroll-globals* object) ;; unknown type +(define-extern bones-mtx-calc function) +(define-extern bones-debug function) +(define-extern dump-bone-mem function) +(define-extern draw-bones-hud function) +(define-extern bones-wrapup function) +;;(define-extern bone-calculation object) ;; unknown type +(define-extern draw-bones-shadow function) +;;(define-extern texscroll-globals object) ;; unknown type +(define-extern dump-mem function) +(define-extern paused? function) +;;(define-extern death-end object) ;; unknown type +;;(define-extern generic-vu0-block object) ;; unknown type +(define-extern generic-sink function) +;;(define-extern *generic-foreground-sinks* object) ;; unknown type +(define-extern generic-dma-foreground-sink-init function) +(define-extern generic-init-buffers function) +(define-extern generic-init-buf function) +(define-extern generic-reset-buffers function) +(define-extern generic-setup-constants function) +(define-extern generic-add-constants function) +;;(define-extern generic-vu1-block object) ;; unknown type +(define-extern generic-envmap-dproc function) +;;(define-extern *generic-consts* object) ;; unknown type +(define-extern generic-post-debug function) +(define-extern generic-light-proc function) +(define-extern generic-envmap-only-proc function) +(define-extern generic-envmap-proc function) +(define-extern generic-no-light-dproc function) +(define-extern generic-initialize-without-sink function) +(define-extern generic-debug-light-proc function) +(define-extern generic-dma-from-spr function) +(define-extern generic-wrapup function) +(define-extern generic-prepare-dma-single function) +(define-extern generic-no-light-proc function) +(define-extern generic-initialize function) +(define-extern generic-none-dma-wait function) +(define-extern generic-none function) +(define-extern generic-no-light function) +(define-extern upload-vu0-program function) +(define-extern generic-no-light-dproc-only function) +(define-extern generic-light function) +(define-extern generic-no-light+envmap function) +(define-extern generic-copy-vtx-dclr-dtex function) +(define-extern generic-interp-dproc function) +;;(define-extern *target-lock* object) ;; unknown type +(define-extern generic-prepare-dma-double function) +(define-extern generic-upload-vu0 function) +(define-extern generic-work-init function) +;;(define-extern *generic-envmap-texture* object) ;; unknown type +(define-extern mercneric-shader-asm function) +;;(define-extern *inv-init-table* object) ;; unknown type +(define-extern mercneric-bittable-asm function) +(define-extern high-speed-reject function) +(define-extern generic-merc-execute-asm function) +(define-extern generic-merc-execute-all function) +(define-extern generic-merc-add-to-cue function) +;;(define-extern mercneric-vu0-block object) ;; unknown type +;;(define-extern invinitdata object) ;; unknown type +(define-extern generic-merc-init-asm function) +(define-extern mercneric-matrix-asm function) +(define-extern mercneric-convert function) +(define-extern merc-death-spawn function) +(define-extern generic-tie-decompress function) +(define-extern generic-tie-dma-to-spad-sync function) +(define-extern generic-tie-display-stats function) +(define-extern generic-tie-execute function) +(define-extern generic-tie-convert-proc function) +(define-extern generic-tie-convert function) +(define-extern generic-tie-debug function) +(define-extern generic-tie-upload-next function) +(define-extern generic-tie-dma-to-spad function) +;;(define-extern *generic-tie* object) ;; unknown type +;;(define-extern shadow-vu0-block object) ;; unknown type +(define-extern shadow-init-vars function) +(define-extern shadow-add-double-edges function) +(define-extern shadow-calc-dual-verts function) +(define-extern shadow-add-double-tris function) +(define-extern shadow-execute-all function) +(define-extern shadow-find-facing-double-tris function) +(define-extern shadow-find-single-edges function) +;;(define-extern *shadow-data* object) ;; unknown type +;;(define-extern shadow-dcache object) ;; unknown type +(define-extern shadow-dma-end function) +(define-extern shadow-find-facing-single-tris function) +(define-extern shadow-execute function) +(define-extern shadow-vu0-upload function) +(define-extern shadow-add-single-edges function) +(define-extern shadow-dma-init function) +(define-extern shadow-scissor-edges function) +(define-extern shadow-add-verts function) +(define-extern shadow-xform-verts function) +;;(define-extern shadow-stats object) ;; unknown type +(define-extern shadow-find-double-edges function) +(define-extern shadow-scissor-top function) +(define-extern shadow-add-facing-single-tris function) +(define-extern shadow-vu1-init-buffer function) +;;(define-extern *shadow-vu1-tri-template* object) ;; unknown type +;;(define-extern shadow-vu1-constants object) ;; unknown type +;;(define-extern shadow-vu1-gifbuf-template object) ;; unknown type +(define-extern shadow-vu1-add-constants function) +(define-extern shadow-vu1-add-matrix function) +;;(define-extern shadow-vu1-block object) ;; unknown type +(define-extern depth-cue-draw-depth function) +(define-extern depth-cue-calc-z function) +(define-extern depth-cue-draw-front function) +;;(define-extern *depth-cue-work* object) ;; unknown type +(define-extern depth-cue function) +(define-extern depth-cue-set-stencil function) +(define-extern draw-string-adv function) +(define-extern get-string-length function) +;;(define-extern *font24-table* object) ;; unknown type +;;(define-extern *font12-table* object) ;; unknown type +;;(define-extern huf-dictionary-node object) ;; unknown type +(define-extern unpack-comp-huf function) +(define-extern unpack-comp-rle function) +;;(define-extern loading object) ;; unknown type +(define-extern upload-vis-bits function) +;;(define-extern background-vu0-block object) ;; unknown type +;;(define-extern *background-work* object) ;; unknown type +(define-extern background-upload-vu0 function) +(define-extern init-background function) +(define-extern finish-background function) +(define-extern draw-drawable-tree-ice-tfrag function) +(define-extern tie-near-make-perspective-matrix function) +(define-extern draw-drawable-tree-tfrag function) +;;(define-extern *instance-tie-work* object) ;; unknown type +(define-extern draw-drawable-tree-instance-shrub function) +(define-extern draw-drawable-tree-dirt-tfrag function) +(define-extern time-of-day-interp-colors-scratch function) +(define-extern draw-drawable-tree-instance-tie function) +;;(define-extern *instance-shrub-work* object) ;; unknown type +(define-extern time-of-day-interp-colors function) +(define-extern draw-drawable-tree-trans-tfrag function) +(define-extern draw-node-cull function) +(define-extern collide-cache-using-y-probe-test function) +(define-extern collide-cache-using-line-sphere-test function) +(define-extern collide-cache-using-box-test function) +(define-extern shrub-init-view-data function) +(define-extern shrub-upload-view-data function) +(define-extern mem-usage-shrub-walk function) +(define-extern shrub-upload-model function) +(define-extern shrub-make-perspective-matrix function) +(define-extern draw-prototype-inline-array-shrub function) +(define-extern shrub-time function) +;;(define-extern shrub-vu1-block object) ;; unknown type +(define-extern shrub-do-init-frame function) +(define-extern shrub-num-tris function) +(define-extern draw-inline-array-instance-shrub function) +(define-extern test-func function) +(define-extern shrub-upload-test function) +(define-extern shrub-init-frame function) +(define-extern upload-generic-shrub function) +(define-extern tfrag-details function) +(define-extern clip-restore function) +;;(define-extern tnear-vu1-block object) ;; unknown type +(define-extern draw-inline-array-tfrag-near function) +(define-extern tfrag-end-buffer function) +(define-extern tfrag-near-end-buffer function) +(define-extern add-tfrag-mtx-0 function) +(define-extern tfrag-init-buffer function) +(define-extern draw-inline-array-tfrag function) +;;(define-extern t-stat object) ;; unknown type +(define-extern tfrag-data-setup function) +(define-extern tfrag-near-init-buffer function) +;;(define-extern tfrag-vu1-block object) ;; unknown type +(define-extern tfrag-print-stats function) +(define-extern stats-tfrag-asm function) +(define-extern add-tfrag-data function) +;;(define-extern *tfrag-display-stats* object) ;; unknown type +(define-extern add-tfrag-mtx-1 function) +(define-extern edge-debug-lines function) +(define-extern vis-cull function) +;;(define-extern tie-vu1-block object) ;; unknown type +(define-extern tie-end-buffer function) +(define-extern tie-init-consts function) +(define-extern tie-float-reg function) +(define-extern tie-int-reg function) +(define-extern tie-ints function) +(define-extern tie-floats function) +;;(define-extern tie-consts object) ;; unknown type +(define-extern tie-init-engine function) +(define-extern tie-near-end-buffer function) +(define-extern tie-near-int-reg function) +;;(define-extern tie-near-vu1-block object) ;; unknown type +;;(define-extern tie-near-consts object) ;; unknown type +(define-extern tie-near-init-consts function) +(define-extern tie-near-init-engine function) +(define-extern tie-near-float-reg function) +;;(define-extern *prototype-tie-work* object) ;; unknown type +(define-extern draw-inline-array-prototype-tie-near-asm function) +(define-extern tie-test-cam-restore function) +(define-extern tie-debug-between function) +(define-extern tie-init-buffers function) +;;(define-extern *tie* object) ;; unknown type +;;(define-extern *pke-hack* object) ;; unknown type +(define-extern draw-inline-array-instance-tie function) +(define-extern draw-inline-array-prototype-tie-generic-asm function) +(define-extern tie-debug-one function) +(define-extern draw-inline-array-prototype-tie-asm function) +(define-extern walk-tie-generic-prototypes function) +;;(define-extern tie-instance-debug object) ;; unknown type +;;(define-extern set-fov object) ;; unknown type +;;(define-extern sync object) ;; unknown type +;;(define-extern *part-group-id-table* object) ;; unknown type +(define-extern lookup-part-group-pointer-by-name function) +(define-extern sp-rotate-system function) +(define-extern sp-launch-particles-death function) +;;(define-extern *sp-launch-queue* object) ;; unknown type +;;(define-extern *death-adgif* object) ;; unknown type +;;(define-extern sp-queued-launch-particles object) ;; unknown type +(define-extern unlink-part-group-by-heap function) +(define-extern sp-adjust-launch function) +(define-extern sp-clear-queue function) +(define-extern sp-queue-launch function) +(define-extern sp-relaunch-setup-fields function) +(define-extern sp-relaunch-particle-2d function) +(define-extern birth-func-copy-omega-to-z function) +(define-extern sparticle-track-root-prim function) +(define-extern particle-setup-adgif function) +;;(define-extern *sp-launcher-lock* object) ;; unknown type +(define-extern birth-func-copy-rot-color function) +;;(define-extern *part-id-table* object) ;; unknown type +;;(define-extern *particle-adgif-cache* object) ;; unknown type +;;(define-extern *global-toggle* object) ;; unknown type +(define-extern sp-launch-particles-var function) +;;(define-extern sparticle-birthinfo object) ;; unknown type +;;(define-extern *sp-launcher-enable* object) ;; unknown type +;;(define-extern particle-adgif-cache object) ;; unknown type +(define-extern birth-func-random-next-time function) +;;(define-extern *particle-300hz-timer* object) ;; unknown type +;;(define-extern sp-launch-queue object) ;; unknown type +(define-extern sp-euler-convert function) +(define-extern lookup-part-group-by-name function) +(define-extern particle-adgif function) +(define-extern sp-relaunch-particle-3d function) +(define-extern birth-func-copy2-rot-color function) +(define-extern sp-init-fields! function) +(define-extern sparticle-track-root function) +(define-extern sp-get-particle function) +;;(define-extern *sp-particle-system-2d* object) ;; unknown type +;;(define-extern *sp-particle-system-3d* object) ;; unknown type +(define-extern sphere-in-view-frustum? function) +(define-extern kill-all-particles-with-key function) +;;(define-extern *time-of-day-proc* object) ;; unknown type +(define-extern forall-particles-runner function) +(define-extern sp-process-block-2d function) +(define-extern sp-process-block-3d function) +(define-extern sp-copy-to-spr function) +(define-extern forall-particles function) +(define-extern sp-process-particle-system function) +(define-extern sparticle-kill-it-level1 function) +(define-extern sp-particle-copy! function) +(define-extern sp-copy-from-spr function) +(define-extern sp-get-approx-alloc-size function) +(define-extern forall-particles-with-key function) +(define-extern sparticle-kill-it-level0 function) +(define-extern sparticle-60-to-50 function) +(define-extern sp-get-block-size function) +(define-extern set-particle-frame-time function) +(define-extern all-particles-60-to-50 function) +(define-extern forall-particles-with-key-runner function) +(define-extern sparticle-kill-it function) +(define-extern kill-all-particles-in-level function) +(define-extern process-particles function) +(define-extern sparticle-50-to-60 function) +(define-extern sp-orbiter function) +(define-extern sp-free-particle function) +(define-extern memcpy function) +;;(define-extern *particles-flag* object) ;; unknown type +(define-extern all-particles-50-to-60 function) +(define-extern sp-kill-particle function) +(define-extern sp-process-block function) +(define-extern entity-info-lookup function) +;;(define-extern *entity-info* object) ;; unknown type +(define-extern crate type) +(define-extern bucket type) +(define-extern money type) +(define-extern springbox type) +(define-extern assistant-levitator type) +(define-extern buzzer type) +(define-extern fuel-cell type) +(define-extern ecovent type) +(define-extern water-vol type) +(define-extern sage-finalboss type) +(define-extern babak type) +(define-extern orb-cache-top type) +(define-extern target-start type) +(define-extern racer type) +(define-extern robotboss type) +(define-extern launcher type) +(define-extern eco type) +(define-extern pickup-spawner type) +(define-extern barrel type) +(define-extern ja-abort-spooled-anim function) +(define-extern art-group-load-check function) +(define-extern art-load function) +;;(define-extern *art-control* object) ;; unknown type +(define-extern ja-play-spooled-anim function) +;;(define-extern *preload-spool-anims* object) ;; unknown type +(define-extern drawable-load function) +;;(define-extern spooling object) ;; unknown type +(define-extern ja-channel-set! function) +(define-extern ja-channel-push! function) +;;(define-extern die object) ;; unknown type +;;(define-extern pending object) ;; unknown type +(define-extern kill-current-level-hint function) +;;(define-extern loaded object) ;; unknown type +;;(define-extern *stack-top* object) ;; unknown type +(define-extern ja-aframe-num function) +;;(define-extern locked object) ;; unknown type +;;(define-extern *load-state* object) ;; unknown type +(define-extern level-hint-surpress! function) +;;(define-extern link object) ;; unknown type +(define-extern task-cstage type) +;;(define-extern ambient-control object) ;; unknown type +;;(define-extern process-taskable object) ;; unknown type +(define-extern task-control type) +;;(define-extern *default-continue* object) ;; unknown type +(define-extern game-task->string function) +(define-extern trsq->continue-point function) +;;(define-extern load object) ;; unknown type +;;(define-extern game-task object) ;; unknown type +;;(define-extern allow-pause object) ;; unknown type +;;(define-extern reset-collide object) ;; unknown type +(define-extern get-game-count function) +;;(define-extern powerup object) ;; unknown type +;;(define-extern eco-blue object) ;; unknown type +;;(define-extern try object) ;; unknown type +;;(define-extern effect object) ;; unknown type +;;(define-extern vent object) ;; unknown type +(define-extern level-hint-spawn function) +(define-extern reset-all-hint-controls function) +;;(define-extern query object) ;; unknown type +;;(define-extern *level-task-data-remap* object) ;; unknown type +;;(define-extern exit object) ;; unknown type +(define-extern close-specific-task! function) +(define-extern touch-tracker-init function) +(define-extern position-in-front-of-camera! function) +;;(define-extern reset object) ;; unknown type +;;(define-extern *level-load-list* object) ;; unknown type +;;(define-extern life object) ;; unknown type +;;(define-extern *spawn-actors* object) ;; unknown type +;;(define-extern eco-pill object) ;; unknown type +(define-extern activate-orb-all function) +;;(define-extern eval object) ;; unknown type +;;(define-extern event object) ;; unknown type +;;(define-extern health object) ;; unknown type +(define-extern set-master-mode function) +;;(define-extern allow-progress object) ;; unknown type +(define-extern set-blackout-frames function) +(define-extern reset-actors function) +(define-extern get-task-control function) +;;(define-extern *kernel-boot-message* object) ;; unknown type +(define-extern play function) +(define-extern stop function) +(define-extern auto-save-check function) +;;(define-extern auto-save object) ;; unknown type +;;(define-extern game-save-tag object) ;; unknown type +(define-extern game-save-elt->string function) +(define-extern auto-save-command function) +;;(define-extern *auto-save-info* object) ;; unknown type +(define-extern auto-save-init-by-other function) +;;(define-extern game-save object) ;; unknown type +(define-extern auto-save-post function) +(define-extern progress-level-index->string function) +;;(define-extern read object) ;; unknown type +;;(define-extern mc-load object) ;; unknown type +;;(define-extern set object) ;; unknown type +;;(define-extern save object) ;; unknown type +;;(define-extern restore object) ;; unknown type +;;(define-extern mc-unformat object) ;; unknown type +(define-extern lookup-level-info function) +;;(define-extern done object) ;; unknown type +(define-extern get-aspect-ratio function) +(define-extern progress-allowed? function) +;;(define-extern *level-task-data* object) ;; unknown type +;;(define-extern format-card object) ;; unknown type +;;(define-extern training object) ;; unknown type +;;(define-extern mc-format object) ;; unknown type +(define-extern get-task-status function) +;;(define-extern create-file object) ;; unknown type +;;(define-extern process-mask object) ;; unknown type +;;(define-extern notify object) ;; unknown type +;;(define-extern unformat-card object) ;; unknown type +;;(define-extern mc-create-file object) ;; unknown type +;;(define-extern get-heap object) ;; unknown type +;;(define-extern mc-save object) ;; unknown type +(define-extern print-game-text function) +;;(define-extern scf-get-time object) ;; unknown type +(define-extern calculate-completion function) +;;(define-extern save-last object) ;; unknown type +;;(define-extern aspect16x9 object) ;; unknown type +;;(define-extern get-card object) ;; unknown type +;;(define-extern scf-get-language object) ;; unknown type +;;(define-extern scf-get-aspect object) ;; unknown type +;;(define-extern *boot-video-mode* object) ;; unknown type +;;(define-extern scf-get-volume object) ;; unknown type +;;(define-extern language object) ;; unknown type +;;(define-extern talking object) ;; unknown type +;;(define-extern hint object) ;; unknown type +(define-extern set-video-mode function) +;;(define-extern bg-a object) ;; unknown type +;;(define-extern bg-b object) ;; unknown type +;;(define-extern near object) ;; unknown type +;;(define-extern mid object) ;; unknown type +;;(define-extern rel object) ;; unknown type +;;(define-extern music object) ;; unknown type +;;(define-extern allow-look-around object) ;; unknown type +;;(define-extern sfx-volume-movie object) ;; unknown type +;;(define-extern bg-a-speed object) ;; unknown type +;;(define-extern sound-flava object) ;; unknown type +;;(define-extern ocean-off object) ;; unknown type +;;(define-extern common-page object) ;; unknown type +;;(define-extern ambient-volume-movie object) ;; unknown type +;;(define-extern dialog-volume-hint object) ;; unknown type +;;(define-extern movie object) ;; unknown type +;;(define-extern bg-a-force object) ;; unknown type +;;(define-extern bg-g object) ;; unknown type +;;(define-extern border-mode object) ;; unknown type +;;(define-extern bg-r object) ;; unknown type +;;(define-extern vibration object) ;; unknown type +;;(define-extern dialog-volume object) ;; unknown type +;;(define-extern ambient object) ;; unknown type +;;(define-extern play-hints object) ;; unknown type +;;(define-extern music-volume-movie object) ;; unknown type +(define-extern set-aspect-ratio function) +;;(define-extern *rolling-mood* object) ;; unknown type +;;(define-extern *misty-mood* object) ;; unknown type +;;(define-extern *ogre-mood-fog-table* object) ;; unknown type +;;(define-extern *citadel-mood-sun-table* object) ;; unknown type +;;(define-extern *lavatube-mood-lights-table* object) ;; unknown type +;;(define-extern *citadel-mood* object) ;; unknown type +;;(define-extern *swamp-mood-fog-table* object) ;; unknown type +;;(define-extern *firecanyon-mood-lights-table* object) ;; unknown type +;;(define-extern *sunken-mood-lights-table* object) ;; unknown type +;;(define-extern *training-mood-fog-table* object) ;; unknown type +;;(define-extern *ogre3-mood-fog-table* object) ;; unknown type +;;(define-extern *swamp-mood-sun-table* object) ;; unknown type +;;(define-extern *ogre2-mood-lights-table* object) ;; unknown type +;;(define-extern *finalboss-interp-table* object) ;; unknown type +;;(define-extern *firecanyon-mood-sun-table* object) ;; unknown type +;;(define-extern *firecanyon-mood-fog-table* object) ;; unknown type +;;(define-extern *darkcave-mood-fog-table* object) ;; unknown type +;;(define-extern *village1-mood* object) ;; unknown type +;;(define-extern *maincave-mood-fog-table* object) ;; unknown type +;;(define-extern *jungleb-mood-sun-table* object) ;; unknown type +;;(define-extern *village1-mood-sun-table* object) ;; unknown type +;;(define-extern *lavatube-mood-sun-table* object) ;; unknown type +;;(define-extern *village3-mood-fog-table* object) ;; unknown type +;;(define-extern *village1-mood-lights-table* object) ;; unknown type +;;(define-extern *rolling-mood-sun-table* object) ;; unknown type +;;(define-extern *ogre2-mood* object) ;; unknown type +;;(define-extern *lavatube-mood* object) ;; unknown type +;;(define-extern *misty-mood-fog-table* object) ;; unknown type +;;(define-extern *darkcave-mood-lights-table* object) ;; unknown type +;;(define-extern *maincave-mood-lights-table* object) ;; unknown type +(define-extern make-rolling-light-kit function) +;;(define-extern *jungleb-mood* object) ;; unknown type +;;(define-extern *default-interp-table* object) ;; unknown type +;;(define-extern *misty-mood-sun-table* object) ;; unknown type +;;(define-extern *village1-mood-fog-table* object) ;; unknown type +;;(define-extern *village1-palette-interp-table* object) ;; unknown type +;;(define-extern *robocave-mood* object) ;; unknown type +(define-extern make-village3-light-kit function) +;;(define-extern *sunken-mood-sun-table* object) ;; unknown type +;;(define-extern *village2-sky-texture-table* object) ;; unknown type +;;(define-extern *default-mood* object) ;; unknown type +;;(define-extern *snow-mood* object) ;; unknown type +;;(define-extern *sunkenb-mood* object) ;; unknown type +;;(define-extern *sunken-mood* object) ;; unknown type +;;(define-extern *jungle-mood* object) ;; unknown type +(define-extern update-mood-erase-color function) +(define-extern make-village1-light-kit function) +;;(define-extern *snow-mood-sun-table* object) ;; unknown type +;;(define-extern *citadel-mood-lights-table* object) ;; unknown type +;;(define-extern *finalboss-mood* object) ;; unknown type +;;(define-extern *firecanyon-palette-interp-table* object) ;; unknown type +(define-extern update-mood-erase-color2 function) +;;(define-extern *snow-mood-lights-table* object) ;; unknown type +;;(define-extern *maincave-mood* object) ;; unknown type +;;(define-extern *village2-mood* object) ;; unknown type +;;(define-extern *darkcave-mood* object) ;; unknown type +;;(define-extern *village3-mood* object) ;; unknown type +;;(define-extern *swamp-mood-lights-table* object) ;; unknown type +;;(define-extern *village2-mood-lights-table* object) ;; unknown type +;;(define-extern *village2-mood-sun-table* object) ;; unknown type +;;(define-extern *village3-mood-lights-table* object) ;; unknown type +;;(define-extern *ogre3-mood-lights-table* object) ;; unknown type +;;(define-extern *rolling-mood-lights-table* object) ;; unknown type +;;(define-extern *finalboss2-mood* object) ;; unknown type +;;(define-extern *rolling-palette-interp-table* object) ;; unknown type +;;(define-extern *beach-mood* object) ;; unknown type +;;(define-extern *ogre-mood* object) ;; unknown type +(define-extern update-mood-shadow-direction function) +(define-extern make-light-kit function) +;;(define-extern *jungleb-mood-lights-table* object) ;; unknown type +;;(define-extern *village2-mood-fog-table* object) ;; unknown type +;;(define-extern *swamp-mood* object) ;; unknown type +;;(define-extern *firecanyon-mood* object) ;; unknown type +;;(define-extern *lavatube-mood-fog-table* object) ;; unknown type +;;(define-extern *ogre-mood-lights-table* object) ;; unknown type +(define-extern make-village2-light-kit function) +;;(define-extern *misty-mood-lights-table* object) ;; unknown type +;;(define-extern *ogre3-mood* object) ;; unknown type +;;(define-extern *citadel-mood-fog-table* object) ;; unknown type +;;(define-extern *sunken-mood-fog-table* object) ;; unknown type +(define-extern make-misty-light-kit function) +;;(define-extern *snow-mood-fog-table* object) ;; unknown type +;;(define-extern *jungleb-mood-fog-table* object) ;; unknown type +;;(define-extern *misty-palette-interp-table* object) ;; unknown type +;;(define-extern *rolling-mood-fog-table* object) ;; unknown type +;;(define-extern *training-mood* object) ;; unknown type +;;(define-extern *finalboss-mood-fog-table* object) ;; unknown type +;;(define-extern *darkcave-mood-sun-table* object) ;; unknown type +;;(define-extern *maincave-mood-sun-table* object) ;; unknown type +;;(define-extern *robocave-mood-fog-table* object) ;; unknown type +;;(define-extern *finalboss-mood-sun-table* object) ;; unknown type +;;(define-extern *flash0* object) ;; unknown type +;;(define-extern *lava-time* object) ;; unknown type +;;(define-extern ogre-states object) ;; unknown type +(define-extern update-mood-robocave function) +(define-extern update-mood-maincave function) +(define-extern update-mood-citadel function) +;;(define-extern flames-state object) ;; unknown type +(define-extern update-mood-fog function) +;;(define-extern rolling-states object) ;; unknown type +(define-extern update-mood-prt-color function) +;;(define-extern *flash4* object) ;; unknown type +;;(define-extern robocave-states object) ;; unknown type +;;(define-extern lavatube-states object) ;; unknown type +(define-extern update-mood-rolling function) +;;(define-extern *rolling-spheres-on* object) ;; unknown type +(define-extern update-mood-village1 function) +;;(define-extern lightning-state object) ;; unknown type +;;(define-extern *flash3* object) ;; unknown type +;;(define-extern *rolling-spheres-light0* object) ;; unknown type +;;(define-extern *lightning-index* object) ;; unknown type +;;(define-extern finalboss-states object) ;; unknown type +(define-extern update-mood-village3 function) +;;(define-extern citadel-states object) ;; unknown type +(define-extern update-mood-snow function) +;;(define-extern maincave-states object) ;; unknown type +(define-extern update-mood-flames function) +(define-extern update-mood-default function) +(define-extern update-light-kit function) +(define-extern clear-mood-times function) +(define-extern update-mood-misty function) +;;(define-extern *rolling-spheres-light4* object) ;; unknown type +;;(define-extern *rolling-spheres-light3* object) ;; unknown type +(define-extern update-mood-ogre function) +;;(define-extern *thunder-id* object) ;; unknown type +(define-extern update-mood-lavatube function) +(define-extern update-mood-firecanyon function) +(define-extern update-mood-itimes function) +;;(define-extern *flash7* object) ;; unknown type +;;(define-extern *thunder-id1* object) ;; unknown type +;;(define-extern *lightning-frame-done* object) ;; unknown type +(define-extern update-mood-lightning function) +;;(define-extern *flash2* object) ;; unknown type +(define-extern update-mood-jungleb-blue function) +(define-extern update-mood-darkcave function) +;;(define-extern snow-states object) ;; unknown type +(define-extern update-mood-jungle function) +;;(define-extern lava-state object) ;; unknown type +(define-extern update-mood-sky-texture function) +(define-extern update-mood-training function) +(define-extern update-mood-palette function) +;;(define-extern training-states object) ;; unknown type +(define-extern update-mood-swamp function) +(define-extern update-mood-lava function) +(define-extern update-mood-jungleb function) +(define-extern update-mood-light function) +;;(define-extern light-time-state object) ;; unknown type +(define-extern update-mood-sunken function) +;;(define-extern *lightning-time* object) ;; unknown type +;;(define-extern *lightning-realtime-done* object) ;; unknown type +;;(define-extern *flash6* object) ;; unknown type +(define-extern update-mood-village2 function) +;;(define-extern *thunder-id0* object) ;; unknown type +;;(define-extern *rolling-spheres-light1* object) ;; unknown type +;;(define-extern *thunder-count* object) ;; unknown type +;;(define-extern *flash1* object) ;; unknown type +;;(define-extern swamp-village2-states object) ;; unknown type +;;(define-extern *lightning-time2* object) ;; unknown type +(define-extern update-mood-caustics function) +;;(define-extern sunken-states object) ;; unknown type +;;(define-extern firecanyon-states object) ;; unknown type +(define-extern update-mood-interp function) +;;(define-extern village1-states object) ;; unknown type +(define-extern set-target-light-index function) +;;(define-extern village3-states object) ;; unknown type +(define-extern update-mood-finalboss function) +;;(define-extern misty-states object) ;; unknown type +;;(define-extern *thunder-id2* object) ;; unknown type +;;(define-extern light-state object) ;; unknown type +(define-extern update-mood-quick function) +;;(define-extern jungle-states object) ;; unknown type +;;(define-extern *rolling-spheres-light2* object) ;; unknown type +;;(define-extern *flash5* object) ;; unknown type +(define-extern target-joint-pos function) +;;(define-extern target-continue object) ;; unknown type +(define-extern update-snow function) +;;(define-extern group-rain-screend-drop object) ;; unknown type +(define-extern check-drop-level-rain function) +(define-extern cam-master-effect function) +(define-extern update-rain function) +(define-extern sparticle-track-sun function) +;;(define-extern part-water-drip object) ;; unknown type +(define-extern matrix-local->world function) +;;(define-extern time-of-day-effect object) ;; unknown type +(define-extern init-time-of-day function) +(define-extern init-time-of-day-context function) +;;(define-extern time-of-day-tick object) ;; unknown type +(define-extern set-time-of-day function) +(define-extern update-time-of-day function) +(define-extern start-time-of-day function) +(define-extern time-of-day-setup function) +(define-extern time-of-day-update function) +(define-extern update-sky-tng-data function) +;;(define-extern sky-base-polygons object) ;; unknown type +(define-extern make-sky-textures function) +;;(define-extern sunken object) ;; unknown type +(define-extern sky-set-orbit function) +(define-extern sky-set-sun-colors-sun function) +(define-extern sky-set-sun-colors-halo function) +(define-extern sky-set-sun-radii function) +(define-extern sky-set-sun-colors function) +(define-extern sky-set-sun-colors-aurora function) +(define-extern sky-make-sun-data function) +;;(define-extern sky-frame-data object) ;; unknown type +;;(define-extern sky-vu1-block object) ;; unknown type +(define-extern sky-init-upload-data function) +(define-extern sky-upload function) +(define-extern sky-draw function) +(define-extern sky-add-frame-data function) +(define-extern sky-make-light function) +(define-extern sky-make-moon-data function) +(define-extern clip-polygon-against-negative-hyperplane function) +(define-extern render-sky-tng function) +(define-extern init-sky-tng-data function) +;;(define-extern sky-cloud-polygons object) ;; unknown type +(define-extern sky-tng-setup-cloud-layer function) +(define-extern copy-cloud-texture function) +;;(define-extern sky-cloud-polygon-indices object) ;; unknown type +(define-extern clip-polygon-against-positive-hyperplane function) +(define-extern sky-duplicate-polys function) +(define-extern sky-tng-setup-clouds function) +(define-extern init-sky-regs function) +;;(define-extern sky-roof-polygons object) ;; unknown type +(define-extern render-sky-tri function) +;;(define-extern *sky-work* object) ;; unknown type +(define-extern copy-sky-texture function) +(define-extern close-sky-buffer function) +(define-extern set-tex-offset function) +(define-extern draw-large-polygon function) +;;(define-extern *sky-tng-data* object) ;; unknown type +(define-extern render-sky-quad function) +;;(define-extern load-boundary object) ;; unknown type +;;(define-extern lbvtx object) ;; unknown type +;;(define-extern *load-boundary-list* object) ;; unknown type +;;(define-extern load-boundary-crossing-command object) ;; unknown type +;;(define-extern *load-boundary-target* object) ;; unknown type +(define-extern edit-load-boundaries function) +(define-extern fix-boundary-normals function) +(define-extern lb-set-player function) +(define-extern save-boundary-cmd function) +(define-extern command-get-int function) +(define-extern check-boundary function) +(define-extern load-state-want-vis function) +(define-extern add-boundary-shader function) +(define-extern load-state-want-levels function) +(define-extern lb-add-vtx-before function) +(define-extern draw-boundary-polygon function) +(define-extern load-boundary-from-template function) +(define-extern ---lb-save function) +(define-extern command-get-time function) +(define-extern format-boundary-cmd function) +(define-extern command-get-quoted-param function) +(define-extern copy-load-command! function) +(define-extern lb-add-load-plane function) +(define-extern triangulate-boundary function) +(define-extern render-boundaries function) +(define-extern replace-load-boundary function) +;;(define-extern *boundary-polygon* object) ;; unknown type +(define-extern command-get-float function) +(define-extern lb-set-camera function) +(define-extern draw-boundary-cap function) +(define-extern lb-add function) +(define-extern load-state-want-display-level function) +(define-extern render-boundary function) +(define-extern init-boundary-regs function) +(define-extern lb-del function) +(define-extern render-boundary-quad function) +(define-extern lb-flip function) +;;(define-extern lb-editor-parms object) ;; unknown type +;;(define-extern *triangulation-buffer* object) ;; unknown type +(define-extern check-open-boundary function) +(define-extern point-in-polygon function) +;;(define-extern *display-load-commands* object) ;; unknown type +(define-extern copy-load-boundary! function) +(define-extern render-boundary-tri function) +(define-extern command-list-get-process function) +(define-extern lb-del-vtx function) +(define-extern lb-add-load function) +(define-extern try-corner function) +(define-extern lb-add-plane function) +;;(define-extern *lb-editor-parms* object) ;; unknown type +(define-extern find-bounding-circle function) +(define-extern check-closed-boundary function) +(define-extern command-get-param function) +(define-extern draw-boundary-side function) +(define-extern lb-add-vtx-after function) +;;(define-extern *backup-load-state* object) ;; unknown type +(define-extern load-state-want-force-vis function) +(define-extern boundary-set-color function) +(define-extern split-monotone-polygon function) +(define-extern lb-copy function) +(define-extern ambient-hint-spawn function) +;;(define-extern shadow object) ;; unknown type +;;(define-extern special object) ;; unknown type +;;(define-extern want-force-inside object) ;; unknown type +;;(define-extern alive object) ;; unknown type +;;(define-extern self object) ;; unknown type +(define-extern process-by-ename function) +;;(define-extern set! object) ;; unknown type +;;(define-extern quote object) ;; unknown type +;;(define-extern teleport object) ;; unknown type +;;(define-extern deg object) ;; unknown type +;;(define-extern want-force-vis object) ;; unknown type +;;(define-extern static-vectorm object) ;; unknown type +(define-extern blackout function) +;;(define-extern setting-unset object) ;; unknown type +;;(define-extern parent object) ;; unknown type +;;(define-extern send-event object) ;; unknown type +;;(define-extern display-level object) ;; unknown type +;;(define-extern seconds object) ;; unknown type +;;(define-extern want-levels object) ;; unknown type +;;(define-extern kill object) ;; unknown type +(define-extern part-tracker-init function) +;;(define-extern time-of-day object) ;; unknown type +;;(define-extern want-vis object) ;; unknown type +;;(define-extern setting-reset object) ;; unknown type +;;(define-extern meters object) ;; unknown type +(define-extern entity-birth-no-kill function) +;;(define-extern *static-load-boundary-list* object) ;; unknown type +;;(define-extern swa object) ;; unknown type +;;(define-extern jub object) ;; unknown type +;;(define-extern fic object) ;; unknown type +;;(define-extern rob object) ;; unknown type +;;(define-extern sno object) ;; unknown type +;;(define-extern sub object) ;; unknown type +;;(define-extern dar object) ;; unknown type +;;(define-extern vi1 object) ;; unknown type +;;(define-extern ogr object) ;; unknown type +;;(define-extern vi2 object) ;; unknown type +;;(define-extern rol object) ;; unknown type +;;(define-extern cit object) ;; unknown type +;;(define-extern darkcave object) ;; unknown type +;;(define-extern bea object) ;; unknown type +;;(define-extern vi3 object) ;; unknown type +;;(define-extern fin object) ;; unknown type +;;(define-extern display-no-wait object) ;; unknown type +;;(define-extern sunkenb object) ;; unknown type +;;(define-extern jun object) ;; unknown type +;;(define-extern special-vis object) ;; unknown type +;;(define-extern robocave object) ;; unknown type +;;(define-extern mai object) ;; unknown type +;;(define-extern lav object) ;; unknown type +;;(define-extern sun object) ;; unknown type +;;(define-extern title object) ;; unknown type +;;(define-extern demo object) ;; unknown type +;;(define-extern default-level object) ;; unknown type +;;(define-extern intro object) ;; unknown type +;;(define-extern halfpipe object) ;; unknown type +;;(define-extern none object) ;; unknown type +;;(define-extern robocave-vis object) ;; unknown type +;;(define-extern tra object) ;; unknown type +;;(define-extern default-level-vis object) ;; unknown type +;;(define-extern lavatube-vis object) ;; unknown type +;;(define-extern maincave-vis object) ;; unknown type +;;(define-extern beach-vis object) ;; unknown type +;;(define-extern jungleb-vis object) ;; unknown type +;;(define-extern sunkenb-vis object) ;; unknown type +;;(define-extern mis object) ;; unknown type +;;(define-extern halfpipe-vis object) ;; unknown type +;;(define-extern ogre-vis object) ;; unknown type +;;(define-extern village3-vis object) ;; unknown type +;;(define-extern int object) ;; unknown type +;;(define-extern swamp-vis object) ;; unknown type +;;(define-extern tit object) ;; unknown type +;;(define-extern rolling-vis object) ;; unknown type +;;(define-extern firecanyon-vis object) ;; unknown type +;;(define-extern snow-vis object) ;; unknown type +;;(define-extern village2-vis object) ;; unknown type +;;(define-extern citadel-vis object) ;; unknown type +;;(define-extern misty-vis object) ;; unknown type +;;(define-extern dem object) ;; unknown type +;;(define-extern jungle-vis object) ;; unknown type +;;(define-extern sunken-vis object) ;; unknown type +;;(define-extern village1-vis object) ;; unknown type +;;(define-extern darkcave-vis object) ;; unknown type +;;(define-extern demo-vis object) ;; unknown type +;;(define-extern finalboss-vis object) ;; unknown type +;;(define-extern intro-vis object) ;; unknown type +;;(define-extern title-vis object) ;; unknown type +;;(define-extern training-vis object) ;; unknown type +(define-extern show-level function) +(define-extern bg function) +;;(define-extern *login-state* object) ;; unknown type +(define-extern load-vis-info function) +(define-extern level-update-after-load function) +(define-extern update-sound-banks function) +(define-extern remap-level-name function) +(define-extern add-bsp-drawable function) +;;(define-extern *print-login* object) ;; unknown type +;;(define-extern link-resume object) ;; unknown type +;;(define-extern display-self object) ;; unknown type +;;(define-extern loading-done object) ;; unknown type +;;(define-extern login object) ;; unknown type +;;(define-extern loading-bt object) ;; unknown type +;;(define-extern level-activate object) ;; unknown type +;;(define-extern unload object) ;; unknown type +;;(define-extern debug-boot object) ;; unknown type +(define-extern on function) +;;(define-extern level-deactivate object) ;; unknown type +(define-extern enable-level-text-file-loading function) +;;(define-extern text-is-loading object) ;; unknown type +(define-extern load-game-text-info function) +(define-extern load-level-text-files function) +(define-extern disable-level-text-file-loading function) +;;(define-extern *level-text-file-load-flag* object) ;; unknown type +;;(define-extern *game-text-word* object) ;; unknown type +(define-extern print-game-text-scaled function) +(define-extern set-font-color-alpha function) +;;(define-extern *game-text-line* object) ;; unknown type +(define-extern draw-debug-text-box function) +;;(define-extern scf-get-territory object) ;; unknown type +(define-extern probe-traverse-inline-array-node function) +(define-extern collide-upload-vu0 function) +(define-extern collide-probe-instance-tie-collide-frags function) +(define-extern misty-ambush-height-probe function) +(define-extern indent-to function) +(define-extern interpolate function) +(define-extern probe-traverse-collide-fragment function) +(define-extern pke-collide-test function) +;;(define-extern *collide-probe-stack* object) ;; unknown type +(define-extern misty-ambush-height function) +(define-extern collide-probe-make-list function) +(define-extern probe-traverse-draw-node function) +(define-extern collide-probe-collide-fragment-tree-make-list function) +(define-extern creates-new-method? function) +(define-extern collide-probe-instance-tie-tree-make-list function) +(define-extern collide-probe-instance-tie function) +(define-extern describe-methods function) +;;(define-extern collide-probe-stack-elem object) ;; unknown type +(define-extern collide-probe-node function) +;;(define-extern collide-probe-stack object) ;; unknown type +(define-extern print-out function) +(define-extern distc function) +(define-extern overrides-parent-method? function) +;;(define-extern collide-vu0-block object) ;; unknown type +(define-extern sphere-cull function) +;;(define-extern oot-work object) ;; unknown type +;;(define-extern spat-work object) ;; unknown type +;;(define-extern sopt-work object) ;; unknown type +;;(define-extern add-prims-touching-work object) ;; unknown type +;;(define-extern pbhp-stack-vars object) ;; unknown type +;;(define-extern *rotate-surface* object) ;; unknown type +;;(define-extern *no-walk-surface* object) ;; unknown type +;;(define-extern edge-grabbed object) ;; unknown type +;;(define-extern target-edge-grab-jump object) ;; unknown type +(define-extern target-attack-up function) +(define-extern debug-report-col-stats function) +(define-extern find-ground-point function) +;;(define-extern *frame-timer* object) ;; unknown type +;;(define-extern *col-timer-enable* object) ;; unknown type +(define-extern collide-shape-draw-debug-marks function) +;;(define-extern *col-timer* object) ;; unknown type +(define-extern simple-collision-reaction function) +(define-extern default-collision-reaction function) +;;(define-extern shove object) ;; unknown type +;;(define-extern collide-mesh-group object) ;; unknown type +;;(define-extern *race-track-surface* object) ;; unknown type +;;(define-extern attack-invinc object) ;; unknown type +;;(define-extern burnup object) ;; unknown type +;;(define-extern deadlyup object) ;; unknown type +;;(define-extern up object) ;; unknown type +;;(define-extern attack-or-shove object) ;; unknown type +;;(define-extern endlessfall object) ;; unknown type +;;(define-extern burn object) ;; unknown type +;;(define-extern deadly object) ;; unknown type +;;(define-extern melt object) ;; unknown type +;;(define-extern ridden object) ;; unknown type +;;(define-extern rotate-y-angle object) ;; unknown type +;;(define-extern *collide-vif0-init* object) ;; unknown type +(define-extern collide-planes-intersect function) +(define-extern collide-planes-test1 function) +(define-extern collide-planes-test0 function) +(define-extern collide-planes function) +(define-extern camera-bounding-box-draw function) +(define-extern camera-cross function) +;;(define-extern death-warp-in object) ;; unknown type +(define-extern death-info type) +;;(define-extern death-warp-out object) ;; unknown type +(define-extern birth-func-death-sparks function) +;;(define-extern death-default object) ;; unknown type +;;(define-extern death-beach-puppy object) ;; unknown type +;;(define-extern *merc-death-globals* object) ;; unknown type +;;(define-extern death-jungle-snake object) ;; unknown type +;;(define-extern warpgate-tele object) ;; unknown type +;;(define-extern temp-enemy-die object) ;; unknown type +;;(define-extern water-control object) ;; unknown type +(define-extern cam-state-from-entity function) +(define-extern parameter-ease-sqrt-clamp function) +(define-extern third-power function) +(define-extern parameter-ease-clamp function) +(define-extern cam-slave-get-float function) +(define-extern fourth-power function) +(define-extern cam-slave-init function) +(define-extern cam-standard-event-handler function) +(define-extern cam-slave-get-vector-with-offset function) +(define-extern vector-into-frustum-nosmooth! function) +(define-extern cam-slave-get-interp-time function) +(define-extern parameter-ease-none function) +(define-extern parameter-ease-sqr-clamp function) +(define-extern cam-curve-pos function) +(define-extern parameter-ease-sin-clamp function) +(define-extern slave-set-rotation! function) +(define-extern cam-slave-get-rot function) +(define-extern slave-matrix-blend-2 function) +(define-extern mat-remove-z-rot function) +(define-extern cam-slave-get-fov function) +(define-extern cam-calc-follow! function) +(define-extern v-slrp3! function) +(define-extern cam-slave-get-intro-step function) +(define-extern cam-curve-setup function) +(define-extern cam-slave-get-flags function) +(define-extern cam-slave-init-vars function) +(define-extern v-slrp2! function) +;;(define-extern *cam-res-string* object) ;; unknown type +(define-extern cam-slave-go function) +(define-extern parameter-ease-lerp-clamp function) +;;(define-extern cam-standoff-read-entity object) ;; unknown type +;;(define-extern -offset object) ;; unknown type +;;(define-extern cam-spline object) ;; unknown type +;;(define-extern change-state-no-go object) ;; unknown type +;;(define-extern slave-option? object) ;; unknown type +;;(define-extern pivot object) ;; unknown type +;;(define-extern target-swim-up object) ;; unknown type +;;(define-extern campoints object) ;; unknown type +;;(define-extern *camera-base-mode* object) ;; unknown type +;;(define-extern slave-activated object) ;; unknown type +;;(define-extern campath object) ;; unknown type +;;(define-extern cam-circular object) ;; unknown type +;;(define-extern point-of-interest object) ;; unknown type +;;(define-extern -off object) ;; unknown type +(define-extern camera-slave-debug function) +;;(define-extern cam-fixed-read-entity object) ;; unknown type +;;(define-extern interpTime object) ;; unknown type +;;(define-extern cam-voicebox object) ;; unknown type +;;(define-extern campath-k object) ;; unknown type +;;(define-extern change-state object) ;; unknown type +;;(define-extern intro-exitValue object) ;; unknown type +;;(define-extern intro-k object) ;; unknown type +;;(define-extern fov object) ;; unknown type +;;(define-extern -on object) ;; unknown type +;;(define-extern stringMaxLength object) ;; unknown type +;;(define-extern align object) ;; unknown type +(define-extern camera-line-rel-len function) +;;(define-extern intro-time object) ;; unknown type +;;(define-extern go object) ;; unknown type +(define-extern camera-teleport-to-entity function) +;;(define-extern *camera-dummy-vector* object) ;; unknown type +(define-extern matrix-world->local function) +(define-extern camera-angle function) +;;(define-extern teleport-to-transformq object) ;; unknown type +(define-extern master-track-target function) +(define-extern in-cam-entity-volume? function) +(define-extern master-switch-to-entity function) +(define-extern cam-master-init function) +(define-extern reset-target-tracking function) +(define-extern master-unset-region function) +(define-extern reset-drawable-tracking function) +(define-extern master-is-hopeful-better? function) +;;(define-extern list-keeper object) ;; unknown type +;;(define-extern cam-master-active object) ;; unknown type +(define-extern reset-follow function) +(define-extern master-check-regions function) +(define-extern master-base-region function) +(define-extern list-keeper-init function) +;;(define-extern list-keeper-active object) ;; unknown type +(define-extern camera-master-bank type) +(define-extern setup-slave-for-hopefull function) +;;(define-extern *CAMERA_MASTER-bank* object) ;; unknown type +(define-extern reset-drawable-follow function) +;;(define-extern cam-fixed object) ;; unknown type +;;(define-extern flags object) ;; unknown type +;;(define-extern query-state object) ;; unknown type +;;(define-extern stringCliffHeight object) ;; unknown type +;;(define-extern teleport-to-other-start-string object) ;; unknown type +;;(define-extern teleport-to-vector-start-string object) ;; unknown type +;;(define-extern yes-follow object) ;; unknown type +;;(define-extern cam-eye object) ;; unknown type +;;(define-extern toggle-slave-option object) ;; unknown type +;;(define-extern copy-tracking object) ;; unknown type +;;(define-extern damp-up object) ;; unknown type +;;(define-extern no-follow object) ;; unknown type +;;(define-extern set-slave-option object) ;; unknown type +;;(define-extern query-fov object) ;; unknown type +;;(define-extern intro-done? object) ;; unknown type +;;(define-extern pvol object) ;; unknown type +;;(define-extern reset-root object) ;; unknown type +;;(define-extern stringMaxHeight object) ;; unknown type +;;(define-extern start-tracking object) ;; unknown type +;;(define-extern no-intro object) ;; unknown type +;;(define-extern stringMinHeight object) ;; unknown type +;;(define-extern cam-string object) ;; unknown type +;;(define-extern cutoutvol object) ;; unknown type +;;(define-extern change-target-bone object) ;; unknown type +(define-extern target-cam-pos function) +;;(define-extern set-interpolation object) ;; unknown type +;;(define-extern force-blend object) ;; unknown type +;;(define-extern stop-tracking object) ;; unknown type +;;(define-extern cam-stick object) ;; unknown type +;;(define-extern clear-entity object) ;; unknown type +;;(define-extern alternates object) ;; unknown type +;;(define-extern tiltAdjust object) ;; unknown type +;;(define-extern blend-from-as-fixed object) ;; unknown type +;;(define-extern change-pov object) ;; unknown type +;;(define-extern dist-from-interp-dest object) ;; unknown type +;;(define-extern change-target object) ;; unknown type +;;(define-extern cam-free-floating object) ;; unknown type +;;(define-extern change-to-entity-by-name object) ;; unknown type +;;(define-extern cam-decel object) ;; unknown type +;;(define-extern vol object) ;; unknown type +;;(define-extern ease-in object) ;; unknown type +;;(define-extern name object) ;; unknown type +;;(define-extern interesting object) ;; unknown type +;;(define-extern clear-slave-option object) ;; unknown type +(define-extern camera-master-debug function) +;;(define-extern stringMinLength object) ;; unknown type +;;(define-extern dist-from-interp-src object) ;; unknown type +(define-extern cam-dist-analog-input function) +(define-extern cam-draw-collide-cache function) +(define-extern cam-calc-bike-follow! function) +(define-extern cam-circular-position function) +(define-extern dist-info-append function) +(define-extern cam-string-bank type) +(define-extern string-push-help function) +;;(define-extern cam-endlessfall object) ;; unknown type +(define-extern cam-string-find-hidden function) +;;(define-extern *CAM_BIKE-bank* object) ;; unknown type +(define-extern cam-string-joystick function) +(define-extern cam-stick-bank type) +(define-extern cam-stick-code function) +;;(define-extern cam-lookat object) ;; unknown type +(define-extern cam-string-line-of-sight function) +(define-extern dist-info-init function) +(define-extern cam-string-move function) +(define-extern cam-billy-bank type) +;;(define-extern *CAM_STICK-bank* object) ;; unknown type +(define-extern cam-bike-code function) +(define-extern dist-info-print function) +(define-extern cam-los-setup-lateral function) +;;(define-extern *CAM_BILLY-bank* object) ;; unknown type +(define-extern set-string-parms function) +;;(define-extern los-dist object) ;; unknown type +;;(define-extern cam-standoff object) ;; unknown type +(define-extern dist-info-valid? function) +(define-extern cam-string-follow function) +;;(define-extern collide-los-dist-info object) ;; unknown type +;;(define-extern cam-bike object) ;; unknown type +;;(define-extern cam-pov-track object) ;; unknown type +;;(define-extern cam-billy object) ;; unknown type +;;(define-extern cam-pov object) ;; unknown type +(define-extern cam-circular-position-into-max-angle function) +(define-extern cam-string-find-position-rel! function) +(define-extern cam-bike-bank type) +(define-extern cam-string-set-position-rel! function) +;;(define-extern *CAM_EYE-bank* object) ;; unknown type +;;(define-extern *CAM_STRING-bank* object) ;; unknown type +;;(define-extern collide-los-result object) ;; unknown type +(define-extern los-cw-ccw function) +(define-extern cam-string-code function) +(define-extern cam-circular-code function) +(define-extern cam-los-spline-collide function) +(define-extern cam-los-collide function) +(define-extern cam-standoff-calc-trans function) +(define-extern cam-eye-bank type) +;;(define-extern cam-pov180 object) ;; unknown type +;;(define-extern focalPull object) ;; unknown type +;;(define-extern focalpull object) ;; unknown type +;;(define-extern set-dist object) ;; unknown type +(define-extern cam-debug-reset-coll-tri function) +;;(define-extern normal object) ;; unknown type +(define-extern cam-debug-add-los-tri function) +(define-extern slave-los-state->string function) +;;(define-extern end-mode object) ;; unknown type +;;(define-extern outro-done object) ;; unknown type +;;(define-extern blocked-side? object) ;; unknown type +;;(define-extern spline-offset object) ;; unknown type +;;(define-extern spline-follow-dist object) ;; unknown type +;;(define-extern joystick object) ;; unknown type +;;(define-extern set-standoff-dist object) ;; unknown type +;;(define-extern maxAngle object) ;; unknown type +;;(define-extern set-standoff-height object) ;; unknown type +(define-extern cam-collision-record-save function) +;;(define-extern no-hit object) ;; unknown type +(define-extern CAM_ORBIT-bank type) +;;(define-extern camera-orbit-info object) ;; unknown type +;;(define-extern camera-free-floating-move-info object) ;; unknown type +;;(define-extern *CAM_ORBIT-bank* object) ;; unknown type +;;(define-extern cam-point-watch object) ;; unknown type +;;(define-extern *CAM_FREE-bank* object) ;; unknown type +;;(define-extern cam-orbit object) ;; unknown type +(define-extern cam-point-watch-bank type) +;;(define-extern *CAM_POINT_WATCH-bank* object) ;; unknown type +(define-extern cam-free-floating-move function) +(define-extern cam-free-bank type) +(define-extern cam-free-floating-input function) +;;(define-extern *camera-orbit-info* object) ;; unknown type +(define-extern cam-combiner-init function) +;;(define-extern cam-combiner-active object) ;; unknown type +;;(define-extern *timer-value* object) ;; unknown type +;;(define-extern *start-timer* object) ;; unknown type +;;(define-extern *save-camera-inv-rot* object) ;; unknown type +(define-extern plane-from-points function) +(define-extern update-camera function) +(define-extern update-view-planes function) +(define-extern set-point function) +(define-extern move-camera-from-pad function) +;;(define-extern *start-pos* object) ;; unknown type +;;(define-extern *update-leaf-when-outside-bsp* object) ;; unknown type +(define-extern update-visible function) +;;(define-extern pause object) ;; unknown type +;;(define-extern pad-1 object) ;; unknown type +;;(define-extern pad-0 object) ;; unknown type +;;(define-extern vol-control object) ;; unknown type +;;(define-extern plane-volume object) ;; unknown type +(define-extern cam-layout-do-menu function) +;;(define-extern *clm-intro-attr* object) ;; unknown type +;;(define-extern *volume-descriptor* object) ;; unknown type +;;(define-extern *volume-normal-current* object) ;; unknown type +(define-extern cam-layout-save-fov function) +(define-extern clmf-save-one function) +(define-extern cam-layout-init function) +;;(define-extern *clm* object) ;; unknown type +(define-extern clmf-cam-deg function) +(define-extern clmf-cam-fov function) +(define-extern cam-layout-entity-volume-info function) +(define-extern clm-item type) +(define-extern clmf-to-focalpull-attr function) +(define-extern cam-layout-save-align function) +(define-extern clm-list-item type) +(define-extern cam-layout-bank type) +(define-extern v-slrp! function) +;;(define-extern *volume-point* object) ;; unknown type +(define-extern clmf-to-edit-cam function) +(define-extern clmf-look-through function) +;;(define-extern *volume-point-current* object) ;; unknown type +(define-extern clmf-save-all function) +(define-extern cam-layout-save-interptime function) +(define-extern cam-layout-start function) +(define-extern cam-layout-save-tiltAdjust function) +(define-extern clmf-to-index-attr function) +(define-extern clmf-cam-float-adjust function) +;;(define-extern clmf-cam-flag-toggle-info object) ;; unknown type +;;(define-extern *clm-cam-lookthrough* object) ;; unknown type +;;(define-extern *camera-layout-blink* object) ;; unknown type +(define-extern cam-layout-save-splineoffset function) +(define-extern clmf-cam-string function) +;;(define-extern *clm-edit* object) ;; unknown type +(define-extern cam-layout-function-call function) +;;(define-extern cam-layout object) ;; unknown type +(define-extern clmf-to-select function) +;;(define-extern *clm-focalpull-attr* object) ;; unknown type +(define-extern clmf-cam-intro-time function) +(define-extern clm-basic type) +(define-extern clmf-save-single function) +(define-extern cam-layout-entity-volume-info-create function) +(define-extern clmf-cam-flag function) +(define-extern cam-layout-restart function) +(define-extern clmf-next-vol-dpad function) +;;(define-extern *clm-cam-attr* object) ;; unknown type +(define-extern cam-layout-save-interesting function) +(define-extern cam-layout-save-stringMinLength function) +(define-extern cam-layout-do-action function) +;;(define-extern *clm-vol-attr* object) ;; unknown type +(define-extern clmf-implement function) +(define-extern cam-layout-intersect-dist function) +(define-extern fov->maya function) +;;(define-extern *volume-normal* object) ;; unknown type +(define-extern clmf-cam-float function) +(define-extern cam-layout-save-flags function) +;;(define-extern cam-layout-active object) ;; unknown type +(define-extern cam-layout-save-introsplinetime function) +(define-extern cam-layout-save-focalpull function) +;;(define-extern *camera-layout-message-ypos* object) ;; unknown type +(define-extern cam-layout-save-focalpull-flags function) +(define-extern cam-layout-save-stringCliffHeight function) +(define-extern clmf-to-spline-attr function) +;;(define-extern *clm-spline-attr* object) ;; unknown type +(define-extern clmf-bna function) +;;(define-extern volume-descriptor-array object) ;; unknown type +(define-extern clmf-input function) +;;(define-extern *clm-select* object) ;; unknown type +(define-extern cam-layout-save-stringMinHeight function) +(define-extern cam-layout-save-cam-rot function) +(define-extern clmf-cam-interp-time function) +(define-extern clmf-to-intro-attr function) +(define-extern cam-layout-save-campoints-flags function) +(define-extern clmf-to-vol-attr function) +(define-extern cam-layout-stop function) +(define-extern cam-layout-save-pivot function) +;;(define-extern *clm-save-one* object) ;; unknown type +(define-extern cam-layout-save-stringMaxHeight function) +(define-extern cam-layout-save-campointsoffset function) +(define-extern clm type) +(define-extern cam-layout-save-introsplineexitval function) +(define-extern interp-test-deg function) +;;(define-extern *clm-save-all* object) ;; unknown type +(define-extern cam-layout-save-maxAngle function) +;;(define-extern *CAM_LAYOUT-bank* object) ;; unknown type +(define-extern clmf-to-edit function) +;;(define-extern *clm-index-attr* object) ;; unknown type +(define-extern cam-layout-save-stringMaxLength function) +(define-extern clmf-cam-flag-toggle function) +(define-extern cam-layout-save-cam-trans function) +(define-extern clmf-next-volume function) +(define-extern clmf-button-test function) +(define-extern cam-layout-save-spline-follow-dist-offset function) +(define-extern clmf-pos-rot function) +(define-extern cam-layout-entity-info function) +(define-extern cam-layout-print function) +;;(define-extern *volume-descriptor-current* object) ;; unknown type +(define-extern clm-item-action type) +(define-extern clmf-cam-meters function) +(define-extern clm-list type) +;;(define-extern interp-test-info object) ;; unknown type +;;(define-extern *last-cur-entity* object) ;; unknown type +(define-extern clmf-next-entity function) +(define-extern interp-test function) +;;(define-extern index object) ;; unknown type +;;(define-extern interpTime-offset object) ;; unknown type +;;(define-extern campoints-offset object) ;; unknown type +;;(define-extern interesting-offset object) ;; unknown type +;;(define-extern stringCliffHeight-offset object) ;; unknown type +(define-extern camera-line-draw function) +;;(define-extern volume object) ;; unknown type +(define-extern camera-fov-frame function) +;;(define-extern cutoutvol-flags object) ;; unknown type +;;(define-extern spline object) ;; unknown type +;;(define-extern stringMinLength-offset object) ;; unknown type +;;(define-extern translation_info object) ;; unknown type +(define-extern camera-line-setup function) +;;(define-extern rot-offset object) ;; unknown type +(define-extern cam-slave-options->string function) +;;(define-extern x object) ;; unknown type +;;(define-extern stringMinHeight-offset object) ;; unknown type +;;(define-extern vol-flags object) ;; unknown type +;;(define-extern spline-follow-dist-offset object) ;; unknown type +;;(define-extern circle object) ;; unknown type +;;(define-extern intro-time-offset object) ;; unknown type +;;(define-extern fov-offset object) ;; unknown type +;;(define-extern right object) ;; unknown type +;;(define-extern triangle object) ;; unknown type +;;(define-extern focalpull-flags object) ;; unknown type +;;(define-extern intro-exitValue-offset object) ;; unknown type +;;(define-extern pivot-offset object) ;; unknown type +;;(define-extern campoints-flags object) ;; unknown type +;;(define-extern tiltAdjust-offset object) ;; unknown type +;;(define-extern l2 object) ;; unknown type +;;(define-extern r2 object) ;; unknown type +(define-extern cam-index-options->string function) +;;(define-extern down object) ;; unknown type +;;(define-extern square object) ;; unknown type +;;(define-extern trans-offset object) ;; unknown type +;;(define-extern align-offset object) ;; unknown type +;;(define-extern left object) ;; unknown type +;;(define-extern stringMaxHeight-offset object) ;; unknown type +;;(define-extern stringMaxLength-offset object) ;; unknown type +;;(define-extern pvol-flags object) ;; unknown type +;;(define-extern maxAngle-offset object) ;; unknown type +;;(define-extern focalPull-offset object) ;; unknown type +(define-extern cam-debug-draw-tris function) +(define-extern bike-cam-limit function) +;;(define-extern *cam-debug-los-tri* object) ;; unknown type +;;(define-extern *camera-old-vu* object) ;; unknown type +;;(define-extern *camera-old-level* object) ;; unknown type +;;(define-extern cam-collision-record-array object) ;; unknown type +(define-extern cam-collision-record-draw function) +;;(define-extern *cam-debug-coll-tri-current* object) ;; unknown type +;;(define-extern *camera-old-cpu* object) ;; unknown type +(define-extern camera-sphere function) +;;(define-extern *cam-collision-record* object) ;; unknown type +;;(define-extern *cam-debug-coll-tri* object) ;; unknown type +;;(define-extern *cam-collision-record-last* object) ;; unknown type +(define-extern cam-line-dma function) +(define-extern cam-collision-record-step function) +(define-extern camera-plot-float-func function) +(define-extern external-cam-reset! function) +(define-extern camera-fov-draw function) +;;(define-extern cam-debug-tri object) ;; unknown type +(define-extern debug-euler function) +;;(define-extern *camera-old-stat-string-tfrag-near* object) ;; unknown type +;;(define-extern *cam-debug-los-tri-current* object) ;; unknown type +(define-extern camera-line-rel function) +;;(define-extern cam-dbg-scratch object) ;; unknown type +;;(define-extern *camera-old-stat-string-total* object) ;; unknown type +;;(define-extern *camera-old-stat-string-tfrag* object) ;; unknown type +(define-extern master-draw-coordinates function) +;;(define-extern *cam-collision-record-show* object) ;; unknown type +(define-extern cam-debug-add-coll-tri function) +;;(define-extern cam-collision-record object) ;; unknown type +;;(define-extern *camera-old-tfrag-bytes* object) ;; unknown type +(define-extern camera-line2d function) +;;(define-extern *cam-collision-record-first* object) ;; unknown type +(define-extern cam-stop function) +(define-extern cam-start function) +(define-extern reset-cameras function) +(define-extern process-drawable-valid? function) +(define-extern anim-loop function) +(define-extern fill-skeleton-cache function) +(define-extern ja-post function) +;;(define-extern *valid-con* object) ;; unknown type +(define-extern ja-max? function) +(define-extern ja-frame-num function) +(define-extern ja-done? function) +(define-extern process-drawable-birth-fuel-cell function) +(define-extern make-nodes-from-jg function) +(define-extern ja-blend-eval function) +(define-extern draw-joint-spheres function) +;;(define-extern process-drawable-idle object) ;; unknown type +(define-extern ja-aframe function) +(define-extern rider-trans function) +(define-extern cspace-children function) +(define-extern cspace-inspect-tree function) +(define-extern rider-post function) +(define-extern ja-num-frames function) +(define-extern process-drawable-delay-player function) +(define-extern ja-group-size function) +(define-extern pusher-post function) +(define-extern execute-math-engine function) +;;(define-extern *default-skel-template* object) ;; unknown type +(define-extern ja-eval function) +(define-extern vector<-cspace+vector! function) +(define-extern process-drawable-fuel-cell-handler function) +(define-extern ja-speed function) +(define-extern ja-min? function) +(define-extern ja-step function) +(define-extern transform-post function) +;;(define-extern *debug-vertex-stats* object) ;; unknown type +;;(define-extern drawable-vertex-ratio object) ;; unknown type +;;(define-extern drawable-tri-count object) ;; unknown type +;;(define-extern mesh object) ;; unknown type +;;(define-extern pickup object) ;; unknown type +(define-extern dma-add-process-drawable function) +;;(define-extern shadow-mask object) ;; unknown type +;;(define-extern texture-bucket object) ;; unknown type +;;(define-extern vis-dist object) ;; unknown type +;;(define-extern root object) ;; unknown type +(define-extern add-process-drawable function) +(define-extern process-release? function) +(define-extern merc-eye-anim function) +;;(define-extern joint-channel object) ;; unknown type +(define-extern process-grab? function) +;;(define-extern prejoint object) ;; unknown type +;;(define-extern lod-dist object) ;; unknown type +(define-extern process-entity-status! function) +(define-extern birth-pickup-at-point function) +;;(define-extern light-index object) ;; unknown type +(define-extern can-hint-be-played? function) +(define-extern update-task-hints function) +(define-extern increment-success-for-hint function) +(define-extern start-hint-timer function) +(define-extern find-hint-control-index function) +;;(define-extern *hint-semaphore* object) ;; unknown type +(define-extern ambient-type-sound function) +(define-extern level-hint-init-by-other function) +(define-extern ambient-inspect function) +(define-extern ambient-type-ocean-off function) +(define-extern ambient-type-sound-loop function) +(define-extern ambient-type-dark function) +(define-extern ambient-type-weather-off function) +;;(define-extern *execute-ambients* object) ;; unknown type +;;(define-extern level-hint-sidekick object) ;; unknown type +;;(define-extern level-hint-exit object) ;; unknown type +;;(define-extern level-hint-normal object) ;; unknown type +;;(define-extern level-hint-error object) ;; unknown type +;;(define-extern level-hint-ambient-sound object) ;; unknown type +(define-extern ambient-hint-init-by-other function) +(define-extern ambient-type-poi function) +(define-extern level-hint-process-cmd function) +(define-extern ambient-type-music function) +(define-extern level-hint-displayed? function) +(define-extern ambient-type-light function) +(define-extern ambient-type-error function) +(define-extern ambient-type-hint function) +(define-extern level-hint-task-process function) +(define-extern ambient-type-ocean-near-off function) +(define-extern can-grab-display? function) +;;(define-extern sound object) ;; unknown type +;;(define-extern poi object) ;; unknown type +;;(define-extern ocean-near-off object) ;; unknown type +;;(define-extern dark object) ;; unknown type +;;(define-extern entity-meters object) ;; unknown type +;;(define-extern weather-off object) ;; unknown type +;;(define-extern text-id object) ;; unknown type +;;(define-extern loc-name-id object) ;; unknown type +(define-extern voicebox-spawn function) +;;(define-extern flava object) ;; unknown type +(define-extern hide-bottom-hud function) +;;(define-extern play-mode object) ;; unknown type +;;(define-extern cmds object) ;; unknown type +;;(define-extern voicebox object) ;; unknown type +(define-extern task-known? function) +;;(define-extern stinger object) ;; unknown type +;;(define-extern look-around object) ;; unknown type +;;(define-extern target-look-around object) ;; unknown type +;;(define-extern priority object) ;; unknown type +(define-extern bottom-hud-hidden? function) +(define-extern __assert-min-max-range-float function) +(define-extern __assert-zero-lim-range-int function) +(define-extern __assert function) +;;(define-extern *run-time-assert-enable* object) ;; unknown type +(define-extern __assert-min-max-range-int function) +;;(define-extern launcher-active object) ;; unknown type +(define-extern command-get-process function) +(define-extern ja-anim-done? function) +;;(define-extern cam-launcher-longfall object) ;; unknown type +;;(define-extern launcher-idle object) ;; unknown type +;;(define-extern manipy-idle object) ;; unknown type +(define-extern process-drawable-pair-random-point! function) +(define-extern camera-change-to function) +(define-extern draw-eco-beam function) +(define-extern command-get-camera function) +(define-extern birth-func-set-quat function) +(define-extern cam-launcher-long-joystick function) +;;(define-extern swingpole-stance object) ;; unknown type +;;(define-extern launcher-deactivated object) ;; unknown type +;;(define-extern *particle-quat* object) ;; unknown type +;;(define-extern med-res-level-idle object) ;; unknown type +(define-extern manipy-init function) +;;(define-extern *lev-string* object) ;; unknown type +(define-extern camera-anim function) +(define-extern cam-launcher-joystick function) +;;(define-extern part-tracker-process object) ;; unknown type +;;(define-extern camera-tracker-process object) ;; unknown type +(define-extern launcher-init-by-other function) +(define-extern camera-tracker-init function) +;;(define-extern swingpole-active object) ;; unknown type +;;(define-extern touch-tracker-idle object) ;; unknown type +(define-extern process-drawable-random-point! function) +(define-extern camera-pov-from function) +;;(define-extern part-spawner-active object) ;; unknown type +(define-extern camera-start type) +(define-extern med-res-level type) +(define-extern command-get-trans function) +(define-extern part-tracker-notify function) +;;(define-extern cam-launcher-shortfall object) ;; unknown type +(define-extern clone-anim-once function) +(define-extern clone-anim function) +(define-extern camera-look-at function) +;;(define-extern wait object) ;; unknown type +;;(define-extern loop object) ;; unknown type +;;(define-extern max-vis-dist object) ;; unknown type +;;(define-extern look-at object) ;; unknown type +;;(define-extern play1 object) ;; unknown type +;;(define-extern clone-parent object) ;; unknown type +;;(define-extern art-name object) ;; unknown type +;;(define-extern fixed object) ;; unknown type +;;(define-extern spring-height object) ;; unknown type +;;(define-extern beach-part-grotto-1 object) ;; unknown type +(define-extern hide-hud-quick function) +;;(define-extern release object) ;; unknown type +;;(define-extern rot-quat object) ;; unknown type +;;(define-extern until object) ;; unknown type +;;(define-extern while object) ;; unknown type +;;(define-extern mode object) ;; unknown type +(define-extern process-drawable-from-entity! function) +;;(define-extern event-hook object) ;; unknown type +;;(define-extern work-set! object) ;; unknown type +;;(define-extern instant-death object) ;; unknown type +(define-extern convert-to-hud-object function) +;;(define-extern alive? object) ;; unknown type +;;(define-extern copy-parent object) ;; unknown type +;;(define-extern message? object) ;; unknown type +;;(define-extern wait-for object) ;; unknown type +;;(define-extern trans-hook object) ;; unknown type +;;(define-extern pole-grab object) ;; unknown type +;;(define-extern target-grab object) ;; unknown type +;;(define-extern mask object) ;; unknown type +;;(define-extern alt-vector object) ;; unknown type +;;(define-extern anim-mode object) ;; unknown type +;;(define-extern work object) ;; unknown type +;;(define-extern still object) ;; unknown type +;;(define-extern blend-shape object) ;; unknown type +;;(define-extern clone-copy-trans object) ;; unknown type +;;(define-extern not object) ;; unknown type +;;(define-extern set-frame-num object) ;; unknown type +;;(define-extern null object) ;; unknown type +;;(define-extern target-launch object) ;; unknown type +;;(define-extern post-hook object) ;; unknown type +;;(define-extern origin-joint-index object) ;; unknown type +;;(define-extern suspend object) ;; unknown type +;;(define-extern center-joint object) ;; unknown type +;;(define-extern launch object) ;; unknown type +;;(define-extern pov object) ;; unknown type +;;(define-extern change-mode object) ;; unknown type +;;(define-extern become-hud-object object) ;; unknown type +;;(define-extern touched object) ;; unknown type +;;(define-extern border object) ;; unknown type +;;(define-extern anim object) ;; unknown type +;;(define-extern attackable object) ;; unknown type +(define-extern line-in-view-frustum? function) +;;(define-extern message object) ;; unknown type +;;(define-extern touch object) ;; unknown type +;;(define-extern *target-shadow-control* object) ;; unknown type +(define-extern ground-tween-initialize function) +(define-extern can-hands? function) +(define-extern can-exit-duck? function) +(define-extern target-start-attack function) +(define-extern set-side-vel function) +(define-extern ground-tween-update function) +(define-extern can-play-stance-amibent? function) +(define-extern fall-test function) +(define-extern slide-down-test function) +(define-extern vector-local+! function) +(define-extern target-height-above-ground function) +(define-extern target-bank type) +(define-extern can-duck? function) +(define-extern target-collide-set! function) +(define-extern target-timed-invulnerable-off function) +(define-extern target-danger-set! function) +(define-extern set-forward-vel function) +(define-extern average-turn-angle function) +(define-extern delete-back-vel function) +(define-extern move-legs? function) +(define-extern smack-surface? function) +(define-extern can-feet? function) +;;(define-extern *jchar-sg* object) ;; unknown type +(define-extern can-jump? function) +(define-extern target-timed-invulnerable function) +(define-extern move-forward function) +(define-extern target-rot function) +(define-extern target-align-vel-z-adjust function) +(define-extern can-wheel? function) +;;(define-extern *TARGET-bank* object) ;; unknown type +;;(define-extern duck-spin object) ;; unknown type +;;(define-extern flop-down object) ;; unknown type +;;(define-extern flut object) ;; unknown type +;;(define-extern wheel-solid object) ;; unknown type +;;(define-extern harmless object) ;; unknown type +;;(define-extern spin-air object) ;; unknown type +;;(define-extern duck-slide object) ;; unknown type +;;(define-extern tube object) ;; unknown type +;;(define-extern punch object) ;; unknown type +;;(define-extern target-falling object) ;; unknown type +;;(define-extern target-slide-down object) ;; unknown type +;;(define-extern spin object) ;; unknown type +;;(define-extern flip object) ;; unknown type +;;(define-extern flut-attack object) ;; unknown type +;;(define-extern target-wheel-flip object) ;; unknown type +;;(define-extern roll object) ;; unknown type +(define-extern birth-func-copy-target-y-rot function) +(define-extern part-tracker-track-target-joint function) +(define-extern birth-func-vector-orient function) +(define-extern process-drawable-burn-effect function) +(define-extern birth-func-ground-orient function) +(define-extern birth-func-target-orient function) +(define-extern part-first-person-hud-selector-func function) +(define-extern part-first-person-hud-right-func function) +(define-extern part-first-person-hud-left-func function) +(define-extern collide-shape-moving-angle-set! function) +(define-extern target-collision-no-reaction function) +(define-extern target-collision-low-coverage function) +(define-extern poly-find-nearest-edge function) +(define-extern target-collision-reaction function) +(define-extern build-conversions function) +(define-extern target-compute-edge function) +(define-extern read-pad function) +(define-extern level-setup function) +(define-extern target-swim-post function) +(define-extern init-target function) +(define-extern target-compute-edge-rider function) +(define-extern target-no-ja-move-post function) +(define-extern target-move-dist function) +(define-extern reverse-conversions function) +(define-extern print-history function) +(define-extern turn-around? function) +(define-extern target-post function) +(define-extern target-compute-pole function) +(define-extern local-pad-angle function) +(define-extern joint-points function) +(define-extern target-no-stick-post function) +(define-extern target-slide-down-post function) +(define-extern post-flag-setup function) +(define-extern draw-history function) +(define-extern vector<-pad-in-surface! function) +(define-extern reset-target-state function) +(define-extern warp-vector-into-surface! function) +(define-extern flag-setup function) +(define-extern target-print-stats function) +(define-extern turn-to-vector function) +(define-extern do-rotations2 function) +(define-extern target-compute-slopes function) +(define-extern add-thrust function) +(define-extern bend-gravity function) +(define-extern target-calc-camera-pos function) +(define-extern target-no-move-post function) +(define-extern vector-turn-to function) +(define-extern do-rotations1 function) +(define-extern add-gravity function) +(define-extern target-real-post function) +(define-extern activate-hud function) +(define-extern target-powerup-process function) +;;(define-extern falling object) ;; unknown type +(define-extern target-generic-event-handler function) +;;(define-extern current object) ;; unknown type +;;(define-extern target-walk object) ;; unknown type +(define-extern init-sidekick function) +(define-extern target-exit function) +;;(define-extern level-enter object) ;; unknown type +;;(define-extern target-clone-anim object) ;; unknown type +(define-extern do-target-shadow function) +;;(define-extern *sidekick-sg* object) ;; unknown type +(define-extern cspace<-cspace+quaternion! function) +;;(define-extern sidekick-clone object) ;; unknown type +(define-extern starts function) +;;(define-extern *sidekick-remap* object) ;; unknown type +;;(define-extern play-anim object) ;; unknown type +;;(define-extern empty-state object) ;; unknown type +(define-extern voicebox-track function) +;;(define-extern camera-voicebox object) ;; unknown type +(define-extern voicebox-init-by-other function) +;;(define-extern *voicebox-sg* object) ;; unknown type +;;(define-extern enter object) ;; unknown type +;;(define-extern idle object) ;; unknown type +(define-extern target-walk-event-handler function) +(define-extern target-standard-event-handler function) +(define-extern target-send-attack function) +(define-extern target-effect-exit function) +(define-extern target-dangerous-event-handler function) +(define-extern target-apply-tongue function) +(define-extern target-shoved function) +(define-extern target-bonk-event-handler function) +(define-extern target-state-hook-exit function) +(define-extern target-attacked function) +(define-extern target-jump-event-handler function) +(define-extern get-intersect-point function) +;;(define-extern ground-height object) ;; unknown type +;;(define-extern neck object) ;; unknown type +(define-extern billy type) +;;(define-extern group-spin-hit object) ;; unknown type +;;(define-extern reset-pickup object) ;; unknown type +;;(define-extern target-stance object) ;; unknown type +;;(define-extern target-play-anim object) ;; unknown type +;;(define-extern no-look-around object) ;; unknown type +;;(define-extern get-attack-count object) ;; unknown type +;;(define-extern get-pickup object) ;; unknown type +;;(define-extern target-periscope object) ;; unknown type +;;(define-extern target-wade-stance object) ;; unknown type +;;(define-extern tongue object) ;; unknown type +;;(define-extern target-fishing object) ;; unknown type +;;(define-extern racing object) ;; unknown type +;;(define-extern target-pole-cycle object) ;; unknown type +;;(define-extern target-load-wait object) ;; unknown type +;;(define-extern no-load-wait object) ;; unknown type +;;(define-extern group-uppercut-hit object) ;; unknown type +;;(define-extern darkeco object) ;; unknown type +;;(define-extern target-tube-start object) ;; unknown type +;;(define-extern damage object) ;; unknown type +;;(define-extern target-snowball-start object) ;; unknown type +;;(define-extern reset-height object) ;; unknown type +;;(define-extern target-swim-stance object) ;; unknown type +;;(define-extern target-jump object) ;; unknown type +;;(define-extern target-billy-game object) ;; unknown type +;;(define-extern target-eco-powerup object) ;; unknown type +;;(define-extern dry object) ;; unknown type +;;(define-extern final-door object) ;; unknown type +;;(define-extern target-hit object) ;; unknown type +;;(define-extern target-racing-start object) ;; unknown type +;;(define-extern target-edge-grab object) ;; unknown type +(define-extern target-powerup-effect function) +;;(define-extern fishing object) ;; unknown type +;;(define-extern target-stance-look-around object) ;; unknown type +;;(define-extern bonk object) ;; unknown type +(define-extern periscope type) +;;(define-extern continue object) ;; unknown type +;;(define-extern target-final-door object) ;; unknown type +;;(define-extern do-effect object) ;; unknown type +;;(define-extern group-flop-hit object) ;; unknown type +;;(define-extern snowball object) ;; unknown type +;;(define-extern target-flut-start object) ;; unknown type +;;(define-extern target-duck-stance object) ;; unknown type +;;(define-extern target-high-jump object) ;; unknown type +;;(define-extern target-flop-hit-ground object) ;; unknown type +;;(define-extern target-duck-walk object) ;; unknown type +;;(define-extern target-wheel object) ;; unknown type +(define-extern mod-var-jump function) +(define-extern target-hit-ground-anim function) +(define-extern target-falling-anim function) +;;(define-extern target-attack-uppercut-jump object) ;; unknown type +(define-extern target-falling-anim-trans function) +(define-extern target-falling-trans function) +;;(define-extern target-running-attack object) ;; unknown type +(define-extern init-var-jump function) +;;(define-extern target-attack object) ;; unknown type +;;(define-extern target-duck-high-jump object) ;; unknown type +;;(define-extern target-flop object) ;; unknown type +;;(define-extern target-double-jump object) ;; unknown type +;;(define-extern target-turn-around object) ;; unknown type +;;(define-extern target-hit-ground object) ;; unknown type +;;(define-extern target-attack-uppercut object) ;; unknown type +;;(define-extern target-attack-air object) ;; unknown type +;;(define-extern target-startup object) ;; unknown type +;;(define-extern target-jump-forward object) ;; unknown type +;;(define-extern target-duck-high-jump-jump object) ;; unknown type +;;(define-extern target-yellow-blast object) ;; unknown type +;;(define-extern swim-flop object) ;; unknown type +;;(define-extern target-ice-stance object) ;; unknown type +;;(define-extern collide-offset object) ;; unknown type +;;(define-extern target-ice-walk object) ;; unknown type +;;(define-extern target-swim-down object) ;; unknown type +;;(define-extern stuck object) ;; unknown type +;;(define-extern target-yellow-jump-blast object) ;; unknown type +;;(define-extern target-stance-ambient object) ;; unknown type +;;(define-extern target-wade-walk object) ;; unknown type +(define-extern target-land-effect function) +;;(define-extern group-blue-hit-ground-effect object) ;; unknown type +;;(define-extern group-red-eco-strike-ground object) ;; unknown type +;;(define-extern flop-forward object) ;; unknown type +;;(define-extern group-red-eco-spinkick object) ;; unknown type +;;(define-extern target-hit-ground-hard object) ;; unknown type +;;(define-extern target-swim-jump object) ;; unknown type +(define-extern first-person-hud-init-by-other function) +;;(define-extern target-pole-flip-forward-jump object) ;; unknown type +;;(define-extern target-edge-grab-off object) ;; unknown type +;;(define-extern hud-normal object) ;; unknown type +;;(define-extern target-pole-flip-forward object) ;; unknown type +;;(define-extern hud-waiting object) ;; unknown type +;;(define-extern first-person-hud object) ;; unknown type +;;(define-extern hud-coming-in object) ;; unknown type +;;(define-extern target-swim-jump-jump object) ;; unknown type +;;(define-extern *fp-hud-stack* object) ;; unknown type +;;(define-extern hud-going-out object) ;; unknown type +(define-extern look-for-points-of-interest function) +;;(define-extern *yellow-jump-mods* object) ;; unknown type +;;(define-extern target-pole-flip-up-jump object) ;; unknown type +;;(define-extern target-swim-walk object) ;; unknown type +(define-extern target-swim-tilt function) +;;(define-extern target-pole-flip-up object) ;; unknown type +;;(define-extern progress-gone object) ;; unknown type +;;(define-extern shock-out object) ;; unknown type +;;(define-extern min-max object) ;; unknown type +;;(define-extern drown-death object) ;; unknown type +(define-extern projectile-init-by-other function) +(define-extern enable-hud function) +;;(define-extern progress-going-out object) ;; unknown type +;;(define-extern stance object) ;; unknown type +;;(define-extern drown object) ;; unknown type +;;(define-extern go-away object) ;; unknown type +(define-extern disable-hud function) +;;(define-extern shock-in object) ;; unknown type +;;(define-extern generic object) ;; unknown type +;;(define-extern target-death object) ;; unknown type +(define-extern target-death-anim function) +(define-extern target-hit-push function) +;;(define-extern *death-spool-array* object) ;; unknown type +(define-extern death-movie-remap function) +(define-extern target-hit-setup-anim function) +;;(define-extern *smack-mods* object) ;; unknown type +;;(define-extern *auto-continue* object) ;; unknown type +;;(define-extern *smack-up-mods* object) ;; unknown type +;;(define-extern *deathcam-sg* object) ;; unknown type +(define-extern target-hit-orient function) +(define-extern velocity-set-to-target! function) +(define-extern target-hit-move function) +(define-extern target-hit-effect function) +(define-extern next-level function) +;;(define-extern lava object) ;; unknown type +(define-extern task-closed? function) +;;(define-extern music-movie-volume object) ;; unknown type +;;(define-extern sfx-movie-volume object) ;; unknown type +(define-extern sharkey type) +;;(define-extern up-forward object) ;; unknown type +(define-extern dark-eco-pool type) +;;(define-extern abort-request object) ;; unknown type +;;(define-extern death object) ;; unknown type +;;(define-extern ogreboss-super-boulder object) ;; unknown type +(define-extern start-sequence-a function) +(define-extern pov-camera-init-by-other function) +;;(define-extern back object) ;; unknown type +;;(define-extern target-title object) ;; unknown type +;;(define-extern target-demo object) ;; unknown type +;;(define-extern target-warp-in object) ;; unknown type +;;(define-extern tar object) ;; unknown type +;;(define-extern group-smack-surface-dizzy object) ;; unknown type +;;(define-extern front object) ;; unknown type +;;(define-extern group-smack-surface object) ;; unknown type +;;(define-extern hidden-other object) ;; unknown type +(define-extern plant-boss type) +(define-extern debug-menu-item-flag-msg function) +(define-extern debug-menu-append-item function) +(define-extern debug-menu-render function) +(define-extern debug-menu-rebuild function) +(define-extern debug-menu-item-send-msg function) +(define-extern debug-menus-active function) +(define-extern debug-menu-context-select-next-or-prev-item function) +(define-extern debug-menu-context-render function) +;;(define-extern debug-menu-item-submenu object) ;; unknown type +(define-extern debug-menu-item-function-render function) +(define-extern debug-menu-item-var-render function) +(define-extern debug-menu-find-from-template function) +(define-extern debug-menu-item-submenu-render function) +(define-extern debug-menu-context-close-submenu function) +(define-extern debug-menu-make-from-template function) +(define-extern debug-menu-item-render function) +(define-extern debug-menu-context-set-root-menu function) +;;(define-extern debug-menu-item object) ;; unknown type +(define-extern debug-menus-handler function) +(define-extern debug-menu-item-var-joypad-handler function) +;;(define-extern debug-menu-item-flag object) ;; unknown type +(define-extern debug-menu-item-function-msg function) +(define-extern debug-menu-context-grab-joypad function) +(define-extern debug-menu-item-submenu-msg function) +(define-extern debug-menu-item-var-make-float function) +;;(define-extern debug-menu-context object) ;; unknown type +(define-extern debug-menu-context-default-selection function) +;;(define-extern debug-menu-item-var object) ;; unknown type +(define-extern debug-menu-context-activate-selection function) +(define-extern debug-menus-default-joypad-func function) +(define-extern debug-menu-item-var-make-int function) +(define-extern debug-menu-remove-all-items function) +;;(define-extern debug-menu object) ;; unknown type +(define-extern debug-menu-item-var-update-display-str function) +(define-extern debug-menu-item-var-msg function) +(define-extern debug-menu-context-send-msg function) +(define-extern debug-menu-item-flag-render function) +(define-extern debug-menu-func-decode function) +;;(define-extern debug-menu-node object) ;; unknown type +(define-extern debug-menu-context-release-joypad function) +(define-extern debug-menu-context-open-submenu function) +;;(define-extern debug-menu-item-function object) ;; unknown type +(define-extern debug-menu-send-msg function) +(define-extern debug-menu-item-get-max-width function) +(define-extern debug-menu-context-select-new-item function) +;;(define-extern var object) ;; unknown type +;;(define-extern flag object) ;; unknown type +;;(define-extern float-var object) ;; unknown type +;;(define-extern int-var object) ;; unknown type +;;(define-extern main-menu object) ;; unknown type +;;(define-extern hex-var object) ;; unknown type +;;(define-extern int-var-gat1 object) ;; unknown type +;;(define-extern invalid object) ;; unknown type +;;(define-extern float-fixed-var object) ;; unknown type +(define-extern prototype-bucket-type function) +(define-extern real-main-draw-hook function) +(define-extern gregs-village1-cam-restore function) +;;(define-extern *hud-lights* object) ;; unknown type +(define-extern display-frame-finish function) +(define-extern swap-display function) +(define-extern gregs-texture2-cam-restore function) +(define-extern paals-cam-restore function) +;;(define-extern *add-sphere* object) ;; unknown type +(define-extern gregs-texture-cam-restore function) +;;(define-extern *instance-mem-usage* object) ;; unknown type +(define-extern display-sync function) +(define-extern main-draw-hook function) +(define-extern gregs-jungle-cam-restore function) +(define-extern eddie-cam-restore function) +;;(define-extern *screen-shot* object) ;; unknown type +(define-extern find-instance-by-name function) +(define-extern prototype-bucket-recalc-fields function) +(define-extern cave-cam-restore function) +;;(define-extern *surrogate-dma-buffer* object) ;; unknown type +(define-extern dma-add-process-drawable-hud function) +(define-extern find-instance-by-index function) +(define-extern main-debug-hook function) +(define-extern marks-cam-restore function) +(define-extern determine-pause-mode function) +(define-extern guard-band-cull function) +(define-extern debug-init-buffer function) +(define-extern error-sphere function) +(define-extern display-frame-start function) +;;(define-extern *edit-instance* object) ;; unknown type +;;(define-extern *generic-effect-mode* object) ;; unknown type +(define-extern draw-instance-info function) +(define-extern update-eyes function) +(define-extern draw-ocean function) +;;(define-extern syncv object) ;; unknown type +(define-extern toggle-pause function) +(define-extern deactivate-progress function) +(define-extern swap-fake-shadow-buffers function) +;;(define-extern put-display-env object) ;; unknown type +(define-extern update-ocean function) +(define-extern instance-tfragment-add-debug-sphere function) +(define-extern instance-sphere-box-intersect? function) +(define-extern drawable-sphere-box-intersect? function) +(define-extern set-hud-aspect-ratio function) +(define-extern main-cheats function) +;;(define-extern *progress-cheat* object) ;; unknown type +(define-extern display-loop function) +(define-extern letterbox function) +;;(define-extern *cheat-temp* object) ;; unknown type +;;(define-extern *master-exit* object) ;; unknown type +;;(define-extern *last-master-mode* object) ;; unknown type +(define-extern off function) +;;(define-extern *screen-filter* object) ;; unknown type +(define-extern set-letterbox-frames function) +(define-extern entity-by-type function) +;;(define-extern scf-get-timeout object) ;; unknown type +(define-extern pause-allowed? function) +;;(define-extern kernel-shutdown object) ;; unknown type +;;(define-extern unknown-cpu-time object) ;; unknown type +(define-extern hide-progress-screen function) +;;(define-extern scf-get-inactive-timeout object) ;; unknown type +(define-extern make-current-level-available-to-progress function) +(define-extern menu-respond-to-pause function) +(define-extern test-closest-pt-in-triangle function) +(define-extern make-collide-list-using-line-sphere-inst-test function) +;;(define-extern *already-printed-exeeded-max-cache-tris* object) ;; unknown type +;;(define-extern lsmi-work object) ;; unknown type +;;(define-extern collide-puls-work object) ;; unknown type +;;(define-extern *max-dma* object) ;; unknown type +(define-extern entity-task-complete-off function) +(define-extern entity-remap-names function) +;;(define-extern *compact-actors* object) ;; unknown type +(define-extern update-actor-vis-box function) +(define-extern entity-process-count function) +(define-extern entity-count function) +;;(define-extern *vis-actors* object) ;; unknown type +(define-extern entity-task-complete-on function) +(define-extern entity-speed-test function) +(define-extern entity-by-meters function) +(define-extern init-entity function) +(define-extern process-status-bits function) +(define-extern expand-vis-box-with-point function) +;;(define-extern visvol object) ;; unknown type +;;(define-extern box object) ;; unknown type +;;(define-extern vis object) ;; unknown type +;;(define-extern actor object) ;; unknown type +(define-extern birth-viewer function) +(define-extern task-control-reset function) +(define-extern plane-volume-intersect-dist function) +(define-extern inc-mod3 function) +;;(define-extern *edge-vert0-table* object) ;; unknown type +(define-extern add-collide-shape-spheres function) +;;(define-extern *color-dark-green* object) ;; unknown type +;;(define-extern *color-cyan* object) ;; unknown type +(define-extern nav-mesh-lookup-route function) +;;(define-extern *test-ray-start-poly-id* object) ;; unknown type +(define-extern nav-mesh-update-route-table function) +;;(define-extern *debug-nav-travel* object) ;; unknown type +;;(define-extern *debug-ray-test-capture-output* object) ;; unknown type +;;(define-extern *debug-traverse* object) ;; unknown type +;;(define-extern *color-dark-cyan* object) ;; unknown type +(define-extern circle-triangle-intersection? function) +(define-extern debug-report-nav-stats function) +;;(define-extern *nav-patch-route-table* object) ;; unknown type +;;(define-extern *clip-for-spheres-timer* object) ;; unknown type +;;(define-extern *color-dark-magenta* object) ;; unknown type +(define-extern choose-travel-portal-vertex function) +(define-extern clip-vector-to-halfspace! function) +;;(define-extern *color-black* object) ;; unknown type +;;(define-extern *color-yellow* object) ;; unknown type +;;(define-extern *color-light-yellow* object) ;; unknown type +;;(define-extern *color-blue* object) ;; unknown type +;;(define-extern *edge-mask-table* object) ;; unknown type +(define-extern compute-dir-parm function) +;;(define-extern *debug-nav* object) ;; unknown type +;;(define-extern *color-orange* object) ;; unknown type +;;(define-extern *test-ray-src-pos* object) ;; unknown type +;;(define-extern *debug-offset* object) ;; unknown type +;;(define-extern *color-dark-yellow* object) ;; unknown type +;;(define-extern *nav-last-triangle-test-count* object) ;; unknown type +(define-extern ray-ccw-line-segment-intersection? function) +(define-extern find-closest-circle-ray-intersection function) +(define-extern init-ray-dir-local function) +;;(define-extern *color-light-cyan* object) ;; unknown type +;;(define-extern *travel-timer* object) ;; unknown type +;;(define-extern *debug-nav-ray* object) ;; unknown type +(define-extern add-nav-sphere function) +(define-extern point-inside-poly? function) +(define-extern end-collect-nav function) +;;(define-extern *debug-ray-test* object) ;; unknown type +;;(define-extern *color-light-blue* object) ;; unknown type +(define-extern sign-bit function) +(define-extern init-ray function) +;;(define-extern *nav-update-route-table-route-count* object) ;; unknown type +;;(define-extern *color-light-green* object) ;; unknown type +;;(define-extern *nav-timer-enable* object) ;; unknown type +;;(define-extern *nav-timer* object) ;; unknown type +(define-extern start-collect-nav function) +(define-extern debug-nav-validate-current-poly function) +;;(define-extern *color-gray* object) ;; unknown type +;;(define-extern *nav-triangle-test-count* object) ;; unknown type +;;(define-extern *nav-one-third* object) ;; unknown type +(define-extern circle-tangent-directions function) +;;(define-extern *color-magenta* object) ;; unknown type +(define-extern recursive-inside-poly function) +(define-extern nav-sphere-from-cam function) +;;(define-extern *color-red* object) ;; unknown type +(define-extern init-ray-local function) +;;(define-extern *color-light-red* object) ;; unknown type +;;(define-extern *find-poly-timer* object) ;; unknown type +;;(define-extern *debug-ray-test-capture-mode* object) ;; unknown type +(define-extern circle-triangle-intersection-proc? function) +(define-extern point-inside-rect? function) +;;(define-extern cfs-work object) ;; unknown type +;;(define-extern *edge-vert1-table* object) ;; unknown type +(define-extern nav-ray-test function) +;;(define-extern *debug-output* object) ;; unknown type +;;(define-extern *color-dark-red* object) ;; unknown type +;;(define-extern *debug-tests* object) ;; unknown type +;;(define-extern cfs-travel-vec object) ;; unknown type +;;(define-extern *color-green* object) ;; unknown type +(define-extern nav-ray-test-local? function) +;;(define-extern *nav-update-route-table-ray-count* object) ;; unknown type +(define-extern test-xz-point-on-line-segment? function) +(define-extern vu-point-triangle-intersection? function) +(define-extern point-triangle-distance-min function) +;;(define-extern nav-control-cfs-work object) ;; unknown type +;;(define-extern *color-dark-blue* object) ;; unknown type +(define-extern dec-mod3 function) +;;(define-extern *color-light-magenta* object) ;; unknown type +;;(define-extern *debug-ray-offset* object) ;; unknown type +;;(define-extern *color-white* object) ;; unknown type +(define-extern ray-line-segment-intersection? function) +;;(define-extern *test-ray-dest-pos* object) ;; unknown type +(define-extern pke-nav-hack function) +;;(define-extern nav-mesh-sphere object) ;; unknown type +(define-extern sound-name-with-material function) +;;(define-extern *footstep-surface* object) ;; unknown type +;;(define-extern group-just-poof-dpsnow object) ;; unknown type +;;(define-extern group-just-poof-grass object) ;; unknown type +;;(define-extern group-just-poof-straw object) ;; unknown type +;;(define-extern group-just-footprint-dirt object) ;; unknown type +;;(define-extern group-just-poof-snow object) ;; unknown type +;;(define-extern effect-run-step-left object) ;; unknown type +;;(define-extern land object) ;; unknown type +;;(define-extern effect-run-poof object) ;; unknown type +;;(define-extern death-start object) ;; unknown type +;;(define-extern group-run-poof-wood object) ;; unknown type +;;(define-extern group-land-poof-dpsnow object) ;; unknown type +;;(define-extern group-run-poof-grass object) ;; unknown type +;;(define-extern group-land-poof-neutral object) ;; unknown type +;;(define-extern group-just-footprint-ice object) ;; unknown type +;;(define-extern zoom-land object) ;; unknown type +;;(define-extern group-slide-poof-tar object) ;; unknown type +;;(define-extern group-land-poof-straw object) ;; unknown type +;;(define-extern group-just-poof-swamp object) ;; unknown type +;;(define-extern group-just-footprint-water object) ;; unknown type +;;(define-extern group-run-poof-sand object) ;; unknown type +;;(define-extern group-slide-poof-dpsnow object) ;; unknown type +;;(define-extern effect-just-footprint object) ;; unknown type +;;(define-extern group-land-poof-pcmetal object) ;; unknown type +;;(define-extern group-just-footprint-snow object) ;; unknown type +;;(define-extern group-slide-poof-dirt object) ;; unknown type +;;(define-extern group-land-poof-grass object) ;; unknown type +;;(define-extern group-land-poof-snow object) ;; unknown type +;;(define-extern effect-zoom-land object) ;; unknown type +;;(define-extern group-run-poof-water object) ;; unknown type +;;(define-extern effect-slide object) ;; unknown type +;;(define-extern group-slide-poof-stone object) ;; unknown type +;;(define-extern group-run-poof-pcmetal object) ;; unknown type +;;(define-extern group-slide-poof-straw object) ;; unknown type +;;(define-extern effect-walk-step-left object) ;; unknown type +;;(define-extern group-run-poof-metal object) ;; unknown type +;;(define-extern effect-slide-poof object) ;; unknown type +;;(define-extern group-just-footprint-tar object) ;; unknown type +;;(define-extern group-slide-poof-gravel object) ;; unknown type +;;(define-extern group-just-poof-wood object) ;; unknown type +;;(define-extern group-just-footprint-straw object) ;; unknown type +;;(define-extern group-land-poof-swamp object) ;; unknown type +;;(define-extern group-run-poof-crwood object) ;; unknown type +;;(define-extern group-just-poof-ice object) ;; unknown type +;;(define-extern effect-flut-land object) ;; unknown type +;;(define-extern group-just-poof-sand object) ;; unknown type +;;(define-extern group-just-poof-water object) ;; unknown type +;;(define-extern effect-walk-step-right object) ;; unknown type +;;(define-extern group-run-poof-snow object) ;; unknown type +;;(define-extern group-land-poof-wood object) ;; unknown type +;;(define-extern group-slide-poof-metal object) ;; unknown type +;;(define-extern effect-droppings object) ;; unknown type +;;(define-extern group-slide-poof-snow object) ;; unknown type +;;(define-extern group-slide-poof-wood object) ;; unknown type +;;(define-extern group-just-poof-dirt object) ;; unknown type +;;(define-extern group-just-poof-gravel object) ;; unknown type +;;(define-extern camera-shake object) ;; unknown type +;;(define-extern group-just-poof-crwood object) ;; unknown type +;;(define-extern group-just-footprint-pcmetal object) ;; unknown type +;;(define-extern group-just-footprint-swamp object) ;; unknown type +;;(define-extern group-land-poof-sand object) ;; unknown type +;;(define-extern group-run-poof-stone object) ;; unknown type +;;(define-extern effect-jump-droppings object) ;; unknown type +;;(define-extern effect-zoom-hit object) ;; unknown type +;;(define-extern group-just-footprint-dpsnow object) ;; unknown type +;;(define-extern group-land-poof-crwood object) ;; unknown type +;;(define-extern group-slide-poof-pcmetal object) ;; unknown type +;;(define-extern group-slide-poof-water object) ;; unknown type +;;(define-extern effect-just-poof object) ;; unknown type +;;(define-extern group-slide-poof-neutral object) ;; unknown type +;;(define-extern group-just-poof-metal object) ;; unknown type +;;(define-extern group-just-footprint-grass object) ;; unknown type +;;(define-extern effect-roll object) ;; unknown type +;;(define-extern group-slide-poof-crwood object) ;; unknown type +;;(define-extern flut-land object) ;; unknown type +;;(define-extern effect-land object) ;; unknown type +;;(define-extern group-slide-poof-ice object) ;; unknown type +;;(define-extern group-just-poof-stone object) ;; unknown type +;;(define-extern zoom-hit object) ;; unknown type +;;(define-extern group-just-poof-tar object) ;; unknown type +;;(define-extern slide object) ;; unknown type +;;(define-extern group-land-poof-water object) ;; unknown type +;;(define-extern group-run-poof-neutral object) ;; unknown type +;;(define-extern group-run-poof-dpsnow object) ;; unknown type +;;(define-extern group-just-footprint-metal object) ;; unknown type +;;(define-extern group-land-poof-ice object) ;; unknown type +;;(define-extern group-run-poof-ice object) ;; unknown type +;;(define-extern group-just-footprint-crwood object) ;; unknown type +;;(define-extern group-just-footprint-wood object) ;; unknown type +;;(define-extern group-land-poof-dirt object) ;; unknown type +;;(define-extern effect-land-poof object) ;; unknown type +;;(define-extern effect-run-step-right object) ;; unknown type +;;(define-extern group-just-footprint-gravel object) ;; unknown type +;;(define-extern group-land-poof-metal object) ;; unknown type +;;(define-extern group-run-poof-tar object) ;; unknown type +;;(define-extern group-just-footprint-stone object) ;; unknown type +;;(define-extern group-run-poof-swamp object) ;; unknown type +;;(define-extern group-slide-poof-grass object) ;; unknown type +;;(define-extern group-land-poof-tar object) ;; unknown type +;;(define-extern group-just-footprint-neutral object) ;; unknown type +;;(define-extern group-just-poof-pcmetal object) ;; unknown type +;;(define-extern group-slide-poof-swamp object) ;; unknown type +;;(define-extern group-land-poof-stone object) ;; unknown type +;;(define-extern group-just-footprint-sand object) ;; unknown type +;;(define-extern group-land-poof-gravel object) ;; unknown type +;;(define-extern group-slide-poof-sand object) ;; unknown type +;;(define-extern group-run-poof-dirt object) ;; unknown type +;;(define-extern group-run-poof-straw object) ;; unknown type +;;(define-extern effect-joint object) ;; unknown type +;;(define-extern group-run-poof-gravel object) ;; unknown type +;;(define-extern group-just-poof-neutral object) ;; unknown type +;;(define-extern effect-land-water object) ;; unknown type +(define-extern part-water-splash-callback function) +(define-extern check-water-level-drop-and-die function) +(define-extern check-water-level-above-and-die function) +(define-extern check-water-level-drop function) +(define-extern splash-spawn function) +(define-extern birth-func-y->userdata function) +(define-extern birth-func-ocean-height function) +(define-extern water-vol-init-by-other function) +;;(define-extern update object) ;; unknown type +;;(define-extern water-vol-startup object) ;; unknown type +;;(define-extern heat object) ;; unknown type +;;(define-extern water-vol-idle object) ;; unknown type +(define-extern ocean-get-height function) +;;(define-extern swim-stroke object) ;; unknown type +;;(define-extern attack-event object) ;; unknown type +;;(define-extern water-height object) ;; unknown type +(define-extern eco-fadeout function) +(define-extern eco-track-root-prim-fadeout function) +(define-extern part-tracker-track-root function) +(define-extern sparticle-track-root-money function) +(define-extern part-tracker-move-to-target function) +(define-extern part-tracker-track-target function) +;;(define-extern hud-money object) ;; unknown type +;;(define-extern ecovalve-idle object) ;; unknown type +;;(define-extern ventyellow object) ;; unknown type +;;(define-extern eco-yellow object) ;; unknown type +;;(define-extern fuel-cell-clone-anim object) ;; unknown type +(define-extern add-blue-motion function) +(define-extern check-blue-suck function) +;;(define-extern *fuel-cell-tune-pos* object) ;; unknown type +;;(define-extern eco-collectable object) ;; unknown type +(define-extern money-init-by-other-no-bob function) +;;(define-extern *ecovalve-sg* object) ;; unknown type +(define-extern fuel-cell-pick-anim function) +(define-extern money-init-by-other function) +(define-extern fuel-cell-animate function) +;;(define-extern ecovalve object) ;; unknown type +(define-extern initialize-eco-by-other function) +(define-extern fuel-cell-init-as-clone function) +;;(define-extern vent-blocked object) ;; unknown type +;;(define-extern vent-pickup object) ;; unknown type +(define-extern vent-standard-event-handler function) +(define-extern ventblue type) +;;(define-extern *buzzer-sg* object) ;; unknown type +(define-extern ecovalve-init-by-other function) +;;(define-extern *fuel-cell-sg* object) ;; unknown type +(define-extern buzzer-init-by-other function) +;;(define-extern collectable object) ;; unknown type +(define-extern fuel-cell-init-by-other function) +;;(define-extern vent-wait-for-touch object) ;; unknown type +;;(define-extern eco-red object) ;; unknown type +;;(define-extern *eco-pill-count* object) ;; unknown type +(define-extern add-blue-shake function) +;;(define-extern *money-sg* object) ;; unknown type +;;(define-extern ventred object) ;; unknown type +;;(define-extern eco-bg-blue object) ;; unknown type +;;(define-extern pickup-radius object) ;; unknown type +;;(define-extern stop-cloning object) ;; unknown type +;;(define-extern show object) ;; unknown type +(define-extern othercam-init-by-other function) +;;(define-extern show-particles object) ;; unknown type +;;(define-extern movie-pos object) ;; unknown type +;;(define-extern hide object) ;; unknown type +;;(define-extern eco-bg-red object) ;; unknown type +;;(define-extern notice-blue object) ;; unknown type +;;(define-extern eco-bg-yellow object) ;; unknown type +;;(define-extern set-movie-pos object) ;; unknown type +;;(define-extern eco-bg-green object) ;; unknown type +;;(define-extern blocked object) ;; unknown type +(define-extern eco-blue-glow function) +;;(define-extern actor-pause object) ;; unknown type +;;(define-extern movie-mask object) ;; unknown type +;;(define-extern *sage-tasks* object) ;; unknown type +(define-extern task-exists? function) +;;(define-extern *citb-redsage-tasks* object) ;; unknown type +(define-extern sages-kidnapped? function) +;;(define-extern *citb-yellowsage-tasks* object) ;; unknown type +;;(define-extern *citb-bluesage-tasks* object) ;; unknown type +;;(define-extern *oracle-village3-tasks* object) ;; unknown type +;;(define-extern *null-task-control* object) ;; unknown type +;;(define-extern *mayor-tasks* object) ;; unknown type +;;(define-extern *sage-bluehut-tasks* object) ;; unknown type +;;(define-extern *miners-tasks* object) ;; unknown type +;;(define-extern *oracle-village1-tasks* object) ;; unknown type +;;(define-extern *gambler-tasks* object) ;; unknown type +;;(define-extern *sage-villagec-tasks* object) ;; unknown type +;;(define-extern *assistant-tasks* object) ;; unknown type +;;(define-extern *assistant-village2-tasks* object) ;; unknown type +(define-extern task-status->string function) +;;(define-extern *oracle-village2-tasks* object) ;; unknown type +;;(define-extern *task-controls* object) ;; unknown type +;;(define-extern *citb-greensage-tasks* object) ;; unknown type +;;(define-extern *geologist-tasks* object) ;; unknown type +(define-extern open-specific-task! function) +(define-extern vector-for-ambient function) +(define-extern process-taskable-hide-handler function) +(define-extern process-taskable-hide-exit function) +;;(define-extern othercam-running object) ;; unknown type +(define-extern process-taskable-play-anim-trans function) +(define-extern process-taskable-play-anim-enter function) +(define-extern process-taskable-anim-loop function) +(define-extern process-taskable-hide-enter function) +(define-extern process-taskable-clean-up-after-talking function) +(define-extern process-taskable-play-anim-exit function) +(define-extern othercam-calc function) +(define-extern process-taskable-play-anim-code function) +;;(define-extern be-clone object) ;; unknown type +;;(define-extern lose object) ;; unknown type +;;(define-extern undecided object) ;; unknown type +(define-extern logo type) +;;(define-extern no object) ;; unknown type +(define-extern hud-hidden? function) +;;(define-extern hidden object) ;; unknown type +;;(define-extern play-accept object) ;; unknown type +;;(define-extern yes object) ;; unknown type +;;(define-extern enter-playing object) ;; unknown type +(define-extern hide-hud function) +;;(define-extern shadow-min-max object) ;; unknown type +;;(define-extern play-reject object) ;; unknown type +;;(define-extern clone object) ;; unknown type +;;(define-extern give-cell object) ;; unknown type +(define-extern pov-camera-play-and-reposition function) +;;(define-extern abort object) ;; unknown type +;;(define-extern pov-camera-start-playing object) ;; unknown type +;;(define-extern pov-camera-abort object) ;; unknown type +;;(define-extern pov-camera-startup object) ;; unknown type +;;(define-extern pov-camera-playing object) ;; unknown type +;;(define-extern pov-camera-done-playing object) ;; unknown type +(define-extern cloud-track function) +;;(define-extern *crate-darkeco-sg* object) ;; unknown type +;;(define-extern *crate-wood-sg* object) ;; unknown type +;;(define-extern *crate-iron-sg* object) ;; unknown type +(define-extern crate-init-by-other function) +(define-extern crate-standard-event-handler function) +(define-extern crate-bank type) +(define-extern crate-post function) +;;(define-extern *CRATE-bank* object) ;; unknown type +;;(define-extern *crate-bucket-sg* object) ;; unknown type +;;(define-extern crate-buzzer object) ;; unknown type +;;(define-extern *crate-steel-sg* object) ;; unknown type +;;(define-extern *crate-barrel-sg* object) ;; unknown type +;;(define-extern explode object) ;; unknown type +;;(define-extern special-contents-die object) ;; unknown type +;;(define-extern wake object) ;; unknown type +;;(define-extern steel object) ;; unknown type +;;(define-extern bounce-on object) ;; unknown type +;;(define-extern flut-bonk object) ;; unknown type +;;(define-extern iron object) ;; unknown type +;;(define-extern wood object) ;; unknown type +;;(define-extern crate-type object) ;; unknown type +;;(define-extern hud-arriving object) ;; unknown type +;;(define-extern hud-leaving object) ;; unknown type +;;(define-extern hud-hidden object) ;; unknown type +;;(define-extern hud-in object) ;; unknown type +(define-extern send-hud-increment-event function) +(define-extern hud-init-by-other function) +;;(define-extern hud-collecting object) ;; unknown type +;;(define-extern increment object) ;; unknown type +;;(define-extern enable object) ;; unknown type +;;(define-extern hide-quick object) ;; unknown type +;;(define-extern disable object) ;; unknown type +(define-extern part-hud-health-03-func function) +(define-extern part-hud-health-02-func function) +;;(define-extern hud-fuel-cell object) ;; unknown type +(define-extern part-hud-eco-timer-func function) +;;(define-extern hud-health object) ;; unknown type +(define-extern fuel-cell-hud-center-callback function) +;;(define-extern hud-buzzers object) ;; unknown type +;;(define-extern hud-money-all object) ;; unknown type +;;(define-extern hud-power object) ;; unknown type +(define-extern calculate-rotation-and-color-for-slice function) +(define-extern part-hud-health-01-func function) +(define-extern part-hud-eco-timer-02-func function) +(define-extern show-hud function) +;;(define-extern hud-pickups object) ;; unknown type +(define-extern part-hud-eco-timer-03-func function) +(define-extern part-hud-eco-timer-01-func function) +(define-extern fuel-cell-hud-starburst-4-callback function) +(define-extern part-hud-eco-timer-backing-func function) +;;(define-extern *fuelcell-naked-sg* object) ;; unknown type +(define-extern part-hud-buzzer-func function) +(define-extern fuel-cell-hud-starburst-3-callback function) +(define-extern fuel-cell-hud-orbit-callback function) +;;(define-extern *game-counts* object) ;; unknown type +;;(define-extern *main-options-demo* object) ;; unknown type +;;(define-extern *graphic-title-options-pal* object) ;; unknown type +;;(define-extern *task-egg-starting-x* object) ;; unknown type +;;(define-extern *game-options-demo* object) ;; unknown type +;;(define-extern *options-remap* object) ;; unknown type +;;(define-extern *main-options* object) ;; unknown type +;;(define-extern *game-options-japan* object) ;; unknown type +;;(define-extern *language-name-remap* object) ;; unknown type +;;(define-extern *game-options* object) ;; unknown type +;;(define-extern *load-options* object) ;; unknown type +;;(define-extern *ok-options* object) ;; unknown type +;;(define-extern *save-options* object) ;; unknown type +;;(define-extern *yes-no-options* object) ;; unknown type +;;(define-extern *main-options-demo-shared* object) ;; unknown type +;;(define-extern *title* object) ;; unknown type +;;(define-extern *options* object) ;; unknown type +;;(define-extern *save-options-title* object) ;; unknown type +;;(define-extern *graphic-options* object) ;; unknown type +;;(define-extern *sound-options* object) ;; unknown type +(define-extern part-progress-hud-button-func function) +(define-extern part-progress-card-cell-func function) +(define-extern part-progress-hud-buzzer-func function) +(define-extern part-progress-card-slot-02-func function) +(define-extern fuel-cell-progress-hud-orbit-callback function) +(define-extern part-progress-hud-left-func function) +(define-extern part-progress-hud-orb-func function) +(define-extern part-progress-save-icon-func function) +(define-extern part-progress-card-slot-03-func function) +(define-extern part-progress-hud-right-func function) +(define-extern part-progress-card-slot-01-func function) +(define-extern part-progress-card-slot-04-func function) +(define-extern part-progress-hud-tint-func function) +(define-extern print-language-name function) +(define-extern draw-percent-bar function) +(define-extern adjust-pos function) +(define-extern hide-progress-icons function) +;;(define-extern progress-debug object) ;; unknown type +;;(define-extern *progress-save-info* object) ;; unknown type +;;(define-extern progress-normal object) ;; unknown type +(define-extern progress-global-state type) +(define-extern get-next-level-up function) +;;(define-extern *progress-stack* object) ;; unknown type +;;(define-extern progress-waiting object) ;; unknown type +;;(define-extern *progress-state* object) ;; unknown type +(define-extern make-levels-with-tasks-available-to-progress function) +(define-extern get-next-task-up function) +(define-extern init-game-options function) +(define-extern progress-init-by-other function) +(define-extern get-next-task-down function) +(define-extern get-next-level-down function) +;;(define-extern progress-coming-in object) ;; unknown type +;;(define-extern demo-shared object) ;; unknown type +(define-extern draw-title-credits function) +;;(define-extern *title-credits-spacing* object) ;; unknown type +(define-extern set-credits-font-color function) +(define-extern draw-end-credits function) +;;(define-extern *title-credits-scale* object) ;; unknown type +(define-extern find-nearest-attackable function) +(define-extern projectile-update-velocity-space-wars function) +(define-extern projectile-collision-reaction function) +;;(define-extern search-info object) ;; unknown type +(define-extern spawn-projectile-blue function) +;;(define-extern *search-info* object) ;; unknown type +;;(define-extern projectile-dissipate object) ;; unknown type +(define-extern find-ground-and-draw-shadow function) +;;(define-extern projectile-impact object) ;; unknown type +;;(define-extern projectile-die object) ;; unknown type +;;(define-extern projectile-moving object) ;; unknown type +(define-extern mother-spider type) +(define-extern render-ocean-quad function) +;;(define-extern *swamp-low-ocean-marker* object) ;; unknown type +(define-extern init-ocean-far-regs function) +(define-extern draw-ocean-far function) +(define-extern draw-large-polygon-ocean function) +(define-extern ocean-init-buffer function) +(define-extern ocean-end-buffer function) +(define-extern render-ocean-far function) +;;(define-extern *ocean-map* object) ;; unknown type +(define-extern ocean-generate-verts function) +(define-extern draw-ocean-near function) +(define-extern draw-ocean-mid function) +(define-extern draw-ocean-texture function) +(define-extern ocean-interp-wave function) +;;(define-extern ocean-vu0-block object) ;; unknown type +;;(define-extern *ocean-vu0-work* object) ;; unknown type +(define-extern ocean-texture-add-call-done function) +(define-extern ocean-texture-add-verts-last function) +(define-extern ocean-texture-add-call-rest function) +(define-extern ocean-texture-add-constants function) +(define-extern ocean-texture-add-verts function) +(define-extern ocean-texture-add-call-start function) +;;(define-extern ocean-texture-vu1-block object) ;; unknown type +(define-extern ocean-texture-setup-constants function) +(define-extern ocean-texture-add-envmap function) +;;(define-extern *ocean-texture-work* object) ;; unknown type +(define-extern ocean-mid-camera-masks-set! function) +(define-extern ocean-mid-add-call-flush function) +(define-extern ocean-mid-add-upload-top function) +(define-extern ocean-mid-mask-ptrs-bit? function) +(define-extern ocean-vector-matrix*! function) +(define-extern ocean-mid-camera-masks-bit? function) +(define-extern ocean-mid-add-constants function) +(define-extern ocean-mid-add-call function) +(define-extern ocean-mid-add-upload function) +(define-extern ocean-mid-add-upload-table function) +(define-extern draw-ocean-mid-seams function) +(define-extern ocean-mid-check function) +(define-extern ocean-mid-setup-constants function) +(define-extern ocean-mid-add-upload-bottom function) +(define-extern ocean-mid-add-matrices function) +(define-extern ocean-mid-add-upload-middle function) +(define-extern ocean-matrix*! function) +(define-extern ocean-seams-add-constants function) +;;(define-extern ocean-mid-block object) ;; unknown type +(define-extern draw-ocean-transition function) +(define-extern ocean-trans-mask-ptrs-bit? function) +(define-extern ocean-trans-add-upload function) +(define-extern ocean-trans-add-upload-table function) +(define-extern ocean-trans-add-constants function) +(define-extern ocean-make-trans-camera-masks function) +(define-extern draw-ocean-transition-seams function) +(define-extern ocean-trans-add-upload-strip function) +(define-extern ocean-trans-camera-masks-bit? function) +(define-extern ocean-trans-mask-ptrs-set! function) +(define-extern ocean-transition-check function) +(define-extern ocean-near-add-upload function) +(define-extern ocean-near-setup-constants function) +(define-extern ocean-near-add-constants function) +(define-extern ocean-near-add-call-flush function) +(define-extern ocean-near-add-call function) +;;(define-extern ocean-near-block object) ;; unknown type +(define-extern ocean-near-add-heights function) +(define-extern ocean-near-add-matrices function) +(define-extern draw-shadow function) +(define-extern add-fake-shadow-to-buffer function) +(define-extern compute-and-draw-shadow function) +(define-extern convert-eye-data function) +(define-extern render-eyes function) +;;(define-extern *eye-work* object) ;; unknown type +;;(define-extern glst-named-node object) ;; unknown type +(define-extern glst-head function) +(define-extern glst-tail function) +(define-extern glst-empty? function) +(define-extern glst-node-name function) +(define-extern glst-end-of-list? function) +(define-extern glst-prev function) +;;(define-extern glst-list object) ;; unknown type +(define-extern glst-set-name! function) +(define-extern glst-next function) +(define-extern glst-start-of-list? function) +;;(define-extern glst-node object) ;; unknown type +(define-extern glst-num-elements function) +(define-extern glst-get-node-index function) +(define-extern glst-remove-tail function) +(define-extern glst-find-node-by-name function) +(define-extern glst-remove-head function) +(define-extern glst-add-head function) +(define-extern glst-insert-before function) +(define-extern glst-add-tail function) +(define-extern glst-init-list! function) +(define-extern glst-remove function) +(define-extern glst-insert-after function) +(define-extern glst-length-of-longest-name function) +(define-extern glst-get-node-by-index function) +(define-extern anim-tester-start function) +;;(define-extern *DISP_LIST-bank* object) ;; unknown type +(define-extern anim-test-obj-remove-invalid function) +(define-extern anim-test-sequence-list-handler function) +(define-extern anim-tester-add-newobj function) +;;(define-extern anim-tester object) ;; unknown type +;;(define-extern *ANIM_TESTER-bank* object) ;; unknown type +(define-extern anim-test-sequence-init function) +(define-extern anim-tester-reset function) +(define-extern anim-test-seq-mark-as-edited function) +(define-extern anim-tester-string-get-frame!! function) +(define-extern anim-tester-standard-event-handler function) +(define-extern display-list-control function) +(define-extern anim-tester-save-object-seqs function) +;;(define-extern anim-test-field-highlight-lw object) ;; unknown type +(define-extern anim-tester-real-post function) +(define-extern anim-tester-update-anim-info function) +(define-extern initialize-anim-tester function) +;;(define-extern anim-test-sequence object) ;; unknown type +(define-extern anim-tester-set-name function) +(define-extern anim-tester-bank type) +(define-extern anim-test-obj-list-handler function) +(define-extern anim-tester-save-all-objects function) +;;(define-extern list-field object) ;; unknown type +(define-extern anim-tester-load-object-seqs function) +(define-extern anim-tester-post function) +(define-extern anim-test-seq-item-copy! function) +;;(define-extern anim-test-seq-item object) ;; unknown type +(define-extern anim-tester-stop function) +(define-extern anim-tester-add-object function) +(define-extern DISP_LIST-bank type) +(define-extern anim-tester-pick-item-setup function) +(define-extern anim-tester-disp-frame-num function) +(define-extern anim-test-obj-item-valid? function) +(define-extern anim-test-obj-init function) +(define-extern anim-test-anim-list-handler function) +(define-extern anim-tester-add-sequence function) +(define-extern anim-tester-num-print function) +;;(define-extern *anim-tester* object) ;; unknown type +;;(define-extern list-control object) ;; unknown type +(define-extern anim-test-edit-seq-insert-item function) +(define-extern anim-tester-interface function) +(define-extern anim-tester-adjust-frame function) +;;(define-extern anim-tester-process object) ;; unknown type +;;(define-extern anim-test-obj object) ;; unknown type +(define-extern anim-test-edit-sequence-list-handler function) +(define-extern anim-tester-get-playing-item function) +;;(define-extern *debug-menu-context* object) ;; unknown type +;;(define-extern save-sequences object) ;; unknown type +;;(define-extern pick-sequence object) ;; unknown type +;;(define-extern edit-sequence object) ;; unknown type +;;(define-extern change-anim object) ;; unknown type +;;(define-extern pick-joint-anim object) ;; unknown type +;;(define-extern pick-object object) ;; unknown type +;;(define-extern viewer-ja-name object) ;; unknown type +(define-extern actor-get-arg! function) +(define-extern art-part-name function) +(define-extern init-viewer-for-other function) +;;(define-extern viewer-geo-name object) ;; unknown type +;;(define-extern viewer-process object) ;; unknown type +;;(define-extern viewer-string object) ;; unknown type +(define-extern init-viewer function) +(define-extern add-a-bunch function) +;;(define-extern viewer object) ;; unknown type +;;(define-extern *viewer-sg* object) ;; unknown type +;;(define-extern *viewer* object) ;; unknown type +;;(define-extern part-tester object) ;; unknown type +(define-extern part-tester-init-by-other function) +;;(define-extern *debug-part-dead-pool* object) ;; unknown type +;;(define-extern part-tester-idle object) ;; unknown type +(define-extern start-part function) +;;(define-extern *part-tester-name* object) ;; unknown type +;;(define-extern *part-tester* object) ;; unknown type +(define-extern dm-current-continue function) +(define-extern dm-time-of-day-func function) +(define-extern dm-give-all-cells function) +(define-extern debug-menu-make-instance-menu function) +(define-extern dm-time-of-day-pick-func function) +;;(define-extern *instance-shrub-menu* object) ;; unknown type +(define-extern debug-menu-make-task-menu function) +(define-extern debug-menu-make-task-need-resolution-menu function) +(define-extern dm-time-of-day-func2 function) +(define-extern dm-cam-render-float function) +(define-extern debug-menu-make-task-unknown-menu function) +(define-extern debug-menu-make-camera-menu function) +(define-extern debug-menu-make-task-need-introduction-menu function) +(define-extern dm-instance-pick-func function) +(define-extern build-instance-list function) +(define-extern debug-create-cam-restore function) +(define-extern dm-task-introduction function) +(define-extern dm-subdiv-int function) +(define-extern dm-strip-lines-toggle-pick-func function) +(define-extern dm-cam-externalize function) +(define-extern dm-subdiv-draw-func function) +(define-extern dm-task-reward-speech function) +(define-extern dm-task-resolution function) +;;(define-extern *enable-instance-tie-menu* object) ;; unknown type +(define-extern dm-edit-instance-toggle-pick-func function) +(define-extern debug-menu-make-shader-menu function) +(define-extern dm-cam-settings-func function) +(define-extern build-shader-list function) +(define-extern dm-anim-tester-func function) +;;(define-extern *dm-cam-mode-interpolation* object) ;; unknown type +(define-extern dm-compact-actor-pick-func function) +(define-extern dm-game-mode-pick-func function) +(define-extern dm-boolean-toggle-pick-func function) +(define-extern all-texture-tweak-adjust function) +(define-extern dm-lavabike-ready function) +(define-extern dm-texture-user-set-pick-func function) +(define-extern dm-levitator-ready function) +(define-extern build-continue-menu function) +(define-extern dm-cam-settings-func-int function) +(define-extern debug-menu-make-task-need-reminder-a-menu function) +(define-extern dm-actor-marks-pick-func function) +(define-extern dm-task-unknown function) +(define-extern dm-setting-language function) +(define-extern dm-subdiv-float function) +(define-extern dm-task-reminder-a function) +(define-extern dm-strip-lines-set-pick-func function) +(define-extern debug-menu-make-task-need-reward-speech-menu function) +(define-extern dm-task-get-money function) +(define-extern dm-actor-vis-pick-func function) +(define-extern popup-menu-context-make-default-menus function) +(define-extern dm-enable-instance-func function) +(define-extern dm-task-reminder function) +;;(define-extern *instance-tie-menu* object) ;; unknown type +(define-extern dm-ocean-subdiv-draw-func function) +;;(define-extern *popup-menu-context* object) ;; unknown type +(define-extern dm-shader-pick-func function) +(define-extern dm-cam-mode-func function) +(define-extern dm-task-hint function) +(define-extern dm-vu1-user-set-pick-func function) +(define-extern debug-menu-make-task-need-reminder-menu function) +(define-extern dm-vu1-user-toggle-pick-func function) +(define-extern debug-menu-nodeprocess-safe function) +(define-extern babak-with-cannon-ride-cannon-post function) +(define-extern babak-with-cannon-compute-cannon-dir function) +(define-extern beachcam-spawn function) +(define-extern mistycam-spawn function) +(define-extern point-in-air-box? function) +;;(define-extern air-box object) ;; unknown type +(define-extern point-in-air-box-area? function) +(define-extern add-debug-air-box function) +(define-extern points-in-air? function) +(define-extern point-in-air? function) +;;(define-extern wobbler object) ;; unknown type +;;(define-extern twist-joint object) ;; unknown type +;;(define-extern twister object) ;; unknown type +(define-extern move-grottopole function) +;;(define-extern *flutflut-naked-sg* object) ;; unknown type +;;(define-extern *bladeassm-sg* object) ;; unknown type +;;(define-extern *windmill-one-sg* object) ;; unknown type +;;(define-extern *flutflutegg-sg* object) ;; unknown type +;;(define-extern flutflutegg-physics object) ;; unknown type +;;(define-extern grottopole-idle object) ;; unknown type +;;(define-extern *grottopole-sg* object) ;; unknown type +(define-extern move-grottopole-to-position function) +;;(define-extern grottopole-moving-up object) ;; unknown type +(define-extern bladeassm type) +;;(define-extern flying-rock-idle object) ;; unknown type +;;(define-extern harvester-idle object) ;; unknown type +;;(define-extern ecoventrock-break object) ;; unknown type +(define-extern flying-rock-init-by-other function) +;;(define-extern windmill-one-idle object) ;; unknown type +;;(define-extern *kickrock-sg* object) ;; unknown type +;;(define-extern ecoventrock-idle object) ;; unknown type +(define-extern grottopole type) +;;(define-extern *ecoventrock-sg* object) ;; unknown type +;;(define-extern grottopole-moving-down object) ;; unknown type +;;(define-extern bladeassm-idle object) ;; unknown type +(define-extern ecoventrock type) +;;(define-extern *beachcam-sg* object) ;; unknown type +(define-extern spawn-flying-rock function) +(define-extern bladeassm-prebind-function function) +;;(define-extern harvester-inflate object) ;; unknown type +;;(define-extern flutflutegg-break object) ;; unknown type +;;(define-extern *harvester-sg* object) ;; unknown type +(define-extern beachcam type) +;;(define-extern flutflutegg-idle object) ;; unknown type +(define-extern windmill-one type) +;;(define-extern flying-rock-rolling object) ;; unknown type +(define-extern flutflutegg-hit-sounds function) +;;(define-extern flutflutegg-physics-fall object) ;; unknown type +;;(define-extern flying-rock object) ;; unknown type +(define-extern flutflutegg type) +(define-extern harvester type) +;;(define-extern num-positions object) ;; unknown type +(define-extern bird-lady type) +;;(define-extern *bird-lady-sg* object) ;; unknown type +(define-extern bird-lady-beach type) +;;(define-extern *bird-lady-beach-sg* object) ;; unknown type +;;(define-extern *mayor-sg* object) ;; unknown type +(define-extern mayor type) +(define-extern mayor-lurkerm-reward-speech function) +(define-extern sculptor type) +(define-extern muse-to-idle function) +;;(define-extern *sculptor-muse-sg* object) ;; unknown type +;;(define-extern *sculptor-sg* object) ;; unknown type +(define-extern pelican-fly function) +;;(define-extern pelican-dive object) ;; unknown type +;;(define-extern pelican-fly-to-end object) ;; unknown type +(define-extern pelican-post function) +(define-extern pelican-path-update function) +(define-extern pelican type) +;;(define-extern *PELICAN-bank* object) ;; unknown type +;;(define-extern pelican-wait-at-nest object) ;; unknown type +;;(define-extern pelican-circle object) ;; unknown type +;;(define-extern pelican-to-nest object) ;; unknown type +;;(define-extern pelican-spit object) ;; unknown type +;;(define-extern pelican-wait-at-end object) ;; unknown type +;;(define-extern *pelican-sg* object) ;; unknown type +(define-extern pelican-bank type) +;;(define-extern pelican-explode object) ;; unknown type +;;(define-extern pelican-from-nest object) ;; unknown type +;;(define-extern got-cell? object) ;; unknown type +;;(define-extern zero-func object) ;; unknown type +;;(define-extern position object) ;; unknown type +(define-extern lurkerworm type) +;;(define-extern lurkerworm-strike object) ;; unknown type +;;(define-extern lurkerworm-rise object) ;; unknown type +;;(define-extern lurkerworm-sink object) ;; unknown type +;;(define-extern lurkerworm-idle object) ;; unknown type +;;(define-extern lurkerworm-die object) ;; unknown type +(define-extern lurkerworm-default-post-behavior function) +(define-extern lurkerworm-default-event-handler function) +;;(define-extern *lurkerworm-sg* object) ;; unknown type +(define-extern lurkerworm-joint-callback function) +;;(define-extern lurkerworm-spot object) ;; unknown type +;;(define-extern lurkerworm-rest object) ;; unknown type +(define-extern lurkerworm-prebind-function function) +;;(define-extern *lurkercrab-sg* object) ;; unknown type +(define-extern lurkercrab-vulnerable function) +(define-extern lurkercrab type) +;;(define-extern *lurkercrab-nav-enemy-info* object) ;; unknown type +(define-extern lurkercrab-invulnerable function) +;;(define-extern lurkercrab-pushed object) ;; unknown type +;;(define-extern *lurkerpuppy-nav-enemy-info* object) ;; unknown type +;;(define-extern *lurkerpuppy-sg* object) ;; unknown type +(define-extern lurkerpuppy type) +(define-extern lrocklrg type) +;;(define-extern *lrocklrg-sg* object) ;; unknown type +;;(define-extern beach-rock object) ;; unknown type +;;(define-extern fallen object) ;; unknown type +;;(define-extern seagull-landing object) ;; unknown type +(define-extern seagull-reaction function) +;;(define-extern sound-seagull-squall object) ;; unknown type +(define-extern seagull-init-by-other function) +;;(define-extern *seagull-sg* object) ;; unknown type +;;(define-extern seagull-flying object) ;; unknown type +;;(define-extern seagull-idle object) ;; unknown type +;;(define-extern seagull-soaring object) ;; unknown type +(define-extern seagull-post function) +(define-extern beach-rock-trigger function) +(define-extern seagullflock type) +;;(define-extern seagull object) ;; unknown type +;;(define-extern *seagull-boxes* object) ;; unknown type +;;(define-extern seagullflock-idle object) ;; unknown type +;;(define-extern seagullflock-at-waterfall object) ;; unknown type +;;(define-extern seagull-takeoff object) ;; unknown type +;;(define-extern aybabtu object) ;; unknown type +;;(define-extern sound-beach-waterfall object) ;; unknown type +(define-extern beach-part type) +;;(define-extern babak-breathin object) ;; unknown type +;;(define-extern babak-breathout object) ;; unknown type +;;(define-extern babak-charge object) ;; unknown type +;;(define-extern babak-chest object) ;; unknown type +;;(define-extern babak-dies object) ;; unknown type +;;(define-extern babak-giveup object) ;; unknown type +;;(define-extern babak-roar object) ;; unknown type +;;(define-extern babak-taunt object) ;; unknown type +;;(define-extern babak-win object) ;; unknown type +;;(define-extern babk-taunt object) ;; unknown type +;;(define-extern jump-low object) ;; unknown type +;;(define-extern run-step-right object) ;; unknown type +;;(define-extern slide-poof object) ;; unknown type +;;(define-extern walk-step-left object) ;; unknown type +;;(define-extern walk-step-right object) ;; unknown type +;;(define-extern egg-crack object) ;; unknown type +;;(define-extern rope-stretch object) ;; unknown type +;;(define-extern EFEFCT(8 object) ;; unknown type +;;(define-extern crab-slide object) ;; unknown type +;;(define-extern crab-walk1 object) ;; unknown type +;;(define-extern crab-walk2 object) ;; unknown type +;;(define-extern crab-walk2) object) ;; unknown type +;;(define-extern crab-walk3 object) ;; unknown type +;;(define-extern lurkercrab-dies object) ;; unknown type +;;(define-extern shell-down object) ;; unknown type +;;(define-extern shell-up object) ;; unknown type +;;(define-extern snap object) ;; unknown type +;;(define-extern 8) object) ;; unknown type +;;(define-extern TIME_PEROIOD(8 object) ;; unknown type +;;(define-extern lurkerdog-bite object) ;; unknown type +;;(define-extern lurkerdog-dies object) ;; unknown type +;;(define-extern lurkerdog-idle object) ;; unknown type +;;(define-extern puppy-bark object) ;; unknown type +;;(define-extern run-step-left object) ;; unknown type +;;(define-extern worm-bite object) ;; unknown type +;;(define-extern worm-dies object) ;; unknown type +;;(define-extern worm-sink object) ;; unknown type +;;(define-extern mayor-step-carp object) ;; unknown type +;;(define-extern mayor-step-wood object) ;; unknown type +;;(define-extern pelican-flap object) ;; unknown type +;;(define-extern pelican-gulp object) ;; unknown type +;;(define-extern walk-straw1 object) ;; unknown type +;;(define-extern walk-straw2 object) ;; unknown type +;;(define-extern fuse object) ;; unknown type +;;(define-extern sack-land object) ;; unknown type +;;(define-extern hammer-tap object) ;; unknown type +;;(define-extern TIME_PE0IOD_LOOP object) ;; unknown type +;;(define-extern bird object) ;; unknown type +;;(define-extern bird-2 object) ;; unknown type +;;(define-extern campath-time object) ;; unknown type +;;(define-extern campoints-flags-off object) ;; unknown type +;;(define-extern campoints-flags-on object) ;; unknown type +;;(define-extern flags-off object) ;; unknown type +;;(define-extern flags-on object) ;; unknown type +;;(define-extern focalpull-flags-off object) ;; unknown type +;;(define-extern focalpull-flags-on object) ;; unknown type +;;(define-extern tower-wind2 object) ;; unknown type +;;(define-extern tower-wind3 object) ;; unknown type +;;(define-extern tower-winds object) ;; unknown type +;;(define-extern tower-winds3 object) ;; unknown type +;;(define-extern water-lap object) ;; unknown type +;;(define-extern waterfall object) ;; unknown type +(define-extern village-cam type) +(define-extern get-next-slot-down function) +(define-extern get-next-slot-up function) +;;(define-extern *village-cam-sg* object) ;; unknown type +;;(define-extern *warp-gate-switch-sg* object) ;; unknown type +(define-extern warpgate type) +(define-extern print-level-name function) +(define-extern warp-gate-switch type) +(define-extern warp-gate-init-by-other function) +;;(define-extern trigger-actor object) ;; unknown type +;;(define-extern *oracle-sg* object) ;; unknown type +(define-extern oracle type) +;;(define-extern alt-task object) ;; unknown type +(define-extern battlecontroller-spawn-creature function) +(define-extern battlecontroller-set-task-completed function) +;;(define-extern battlecontroller object) ;; unknown type +;;(define-extern battlecontroller-spawner object) ;; unknown type +(define-extern battlecontroller-camera-on function) +(define-extern battlecontroller-task-completed? function) +(define-extern battlecontroller-update-spawners function) +(define-extern battlecontroller-battle-end function) +(define-extern battlecontroller-draw-debug function) +(define-extern battlecontroller-fill-all-spawners function) +(define-extern battlecontroller-default-event-handler function) +(define-extern battlecontroller-special-contents? function) +(define-extern battlecontroller-spawners-full? function) +;;(define-extern battlecontroller-creature-type object) ;; unknown type +(define-extern battlecontroller-special-contents-collected? function) +(define-extern battlecontroller-spawn-creature-random-spawner function) +(define-extern battlecontroller-off function) +(define-extern battlecontroller-camera-off function) +(define-extern battlecontroller-spawn-creature-at-spawner function) +(define-extern battlecontroller-disable-ocean function) +(define-extern battlecontroller-battle-begin function) +(define-extern battlecontroller-set-special-contents-collected function) +;;(define-extern num-lurkers object) ;; unknown type +;;(define-extern danger object) ;; unknown type +;;(define-extern pathb object) ;; unknown type +;;(define-extern pathg object) ;; unknown type +;;(define-extern fade-actor object) ;; unknown type +;;(define-extern pathd object) ;; unknown type +;;(define-extern percent object) ;; unknown type +;;(define-extern pickup-type object) ;; unknown type +;;(define-extern kill-actor object) ;; unknown type +;;(define-extern spawn object) ;; unknown type +;;(define-extern spawner-blocker-actor object) ;; unknown type +;;(define-extern battlecontroller-active object) ;; unknown type +;;(define-extern patha object) ;; unknown type +;;(define-extern lurker-type object) ;; unknown type +;;(define-extern battlecontroller-die object) ;; unknown type +;;(define-extern pathf object) ;; unknown type +;;(define-extern spawner-trigger-actor object) ;; unknown type +;;(define-extern pathc object) ;; unknown type +;;(define-extern pickup-percent object) ;; unknown type +;;(define-extern battlecontroller-play-intro-camera object) ;; unknown type +;;(define-extern final-pickup object) ;; unknown type +;;(define-extern max-pickup-count object) ;; unknown type +;;(define-extern pathh object) ;; unknown type +;;(define-extern pathspawn object) ;; unknown type +;;(define-extern pathe object) ;; unknown type +;;(define-extern battlecontroller-idle object) ;; unknown type +(define-extern birth-func-random-rot function) +(define-extern citb-part type) +(define-extern check-drop-level-firehose-pops function) +;;(define-extern *citb-arm-c-sg* object) ;; unknown type +;;(define-extern *citb-arm-d-sg* object) ;; unknown type +;;(define-extern *citb-robotboss-leftarm-sg* object) ;; unknown type +(define-extern citb-arm-c type) +;;(define-extern citb-hose-die object) ;; unknown type +;;(define-extern *citb-robotboss-head-sg* object) ;; unknown type +;;(define-extern citb-robotboss-idle object) ;; unknown type +;;(define-extern *citb-disc-b-sg* object) ;; unknown type +;;(define-extern citb-coil-break object) ;; unknown type +;;(define-extern *citb-arm-shoulder-a-sg* object) ;; unknown type +(define-extern citb-launcher type) +;;(define-extern citb-arm object) ;; unknown type +;;(define-extern *citb-robotboss-leftshoulder-sg* object) ;; unknown type +(define-extern citadelcam type) +;;(define-extern citb-hose-idle object) ;; unknown type +;;(define-extern citb-arm-section object) ;; unknown type +;;(define-extern *citb-hose-sg* object) ;; unknown type +;;(define-extern citadelcam-idle object) ;; unknown type +(define-extern citb-generator-trigger-others function) +;;(define-extern *citb-generator-sg* object) ;; unknown type +(define-extern citb-arm-b type) +(define-extern citb-hose type) +;;(define-extern *citb-launcher-sg* object) ;; unknown type +;;(define-extern citb-generator-broken object) ;; unknown type +;;(define-extern citb-disc-idle object) ;; unknown type +;;(define-extern *citb-robotboss-rightshoulder-sg* object) ;; unknown type +;;(define-extern citb-hose-spawn object) ;; unknown type +(define-extern citb-generator type) +;;(define-extern *citb-robotboss-sg* object) ;; unknown type +;;(define-extern *citb-iris-door-sg* object) ;; unknown type +(define-extern citb-hose-event-handler function) +(define-extern citb-button type) +(define-extern citb-arm-shoulder-b type) +;;(define-extern citb-generator-break object) ;; unknown type +;;(define-extern *citb-disc-c-sg* object) ;; unknown type +(define-extern citb-robotboss type) +;;(define-extern citb-arm-shoulder object) ;; unknown type +;;(define-extern *citb-robotboss-belly-sg* object) ;; unknown type +;;(define-extern *citb-robotboss-gun-sg* object) ;; unknown type +;;(define-extern *citb-arm-shoulder-b-sg* object) ;; unknown type +(define-extern citb-arm-shoulder-a type) +;;(define-extern citb-robotboss-die object) ;; unknown type +(define-extern citb-arm-d type) +;;(define-extern *citadelcam-sg* object) ;; unknown type +;;(define-extern *citb-disc-a-sg* object) ;; unknown type +(define-extern citb-disc-a type) +(define-extern citb-iris-door type) +(define-extern citb-arm-a type) +;;(define-extern citb-disc object) ;; unknown type +;;(define-extern *citb-button-sg* object) ;; unknown type +(define-extern citb-disc-b type) +(define-extern citb-chains type) +(define-extern citb-disc-c type) +;;(define-extern citadelcam-stair-plats object) ;; unknown type +;;(define-extern citb-coil-idle object) ;; unknown type +;;(define-extern citb-generator-idle object) ;; unknown type +(define-extern citb-disc-d type) +;;(define-extern *citb-coil-sg* object) ;; unknown type +;;(define-extern *citb-robotboss-rightarm-sg* object) ;; unknown type +(define-extern citb-battlecontroller type) +;;(define-extern citb-coil-broken object) ;; unknown type +;;(define-extern *citb-arm-a-sg* object) ;; unknown type +(define-extern citb-coil type) +;;(define-extern *citb-generator-broken-sg* object) ;; unknown type +;;(define-extern *citb-arm-b-sg* object) ;; unknown type +;;(define-extern *citb-disc-d-sg* object) ;; unknown type +;;(define-extern *citb-robotboss-nose-sg* object) ;; unknown type +;;(define-extern open object) ;; unknown type +;;(define-extern open-actor object) ;; unknown type +;;(define-extern shield-off object) ;; unknown type +;;(define-extern shield-on object) ;; unknown type +(define-extern citb-plat-eco type) +;;(define-extern citb-base-plat object) ;; unknown type +;;(define-extern citb-chain-plat-settle object) ;; unknown type +;;(define-extern *citb-rotatebox-sg* object) ;; unknown type +;;(define-extern citb-exit-plat-idle object) ;; unknown type +(define-extern citb-firehose type) +;;(define-extern *plat-citb-sg* object) ;; unknown type +;;(define-extern *citb-chain-plat-sg* object) ;; unknown type +;;(define-extern *citb-stopbox-sg* object) ;; unknown type +(define-extern citb-rotatebox type) +(define-extern citb-stair-plat type) +(define-extern citb-exit-plat-move-player function) +;;(define-extern *plat-eco-citb-unlit-sg* object) ;; unknown type +(define-extern citb-firehose-blast-particles function) +(define-extern citb-exit-plat type) +;;(define-extern citb-firehose-blast object) ;; unknown type +(define-extern citb-donut type) +(define-extern citb-plat type) +;;(define-extern citb-firehose-idle object) ;; unknown type +;;(define-extern *citb-donut-sg* object) ;; unknown type +;;(define-extern *citb-chain-plat-constants* object) ;; unknown type +(define-extern citb-stopbox type) +;;(define-extern *citb-firehose-sg* object) ;; unknown type +;;(define-extern citb-firehose-active object) ;; unknown type +(define-extern citb-chain-plat type) +;;(define-extern citb-exit-plat-rise object) ;; unknown type +;;(define-extern *plat-eco-citb-lit-sg* object) ;; unknown type +;;(define-extern *citb-exit-plat-sg* object) ;; unknown type +;;(define-extern height-info object) ;; unknown type +;;(define-extern citb-base-plat-idle object) ;; unknown type +;;(define-extern citb-base-plat-active object) ;; unknown type +(define-extern citb-sage-draw-beam function) +;;(define-extern citb-sagecage-idle object) ;; unknown type +;;(define-extern *evilbro-citadel-sg* object) ;; unknown type +;;(define-extern *citb-sagecage-sg* object) ;; unknown type +(define-extern blue-sagecage type) +;;(define-extern citb-sage object) ;; unknown type +(define-extern citb-sagecage-draw-bars function) +;;(define-extern *redsage-sg* object) ;; unknown type +(define-extern green-sagecage type) +;;(define-extern *yellowsage-sg* object) ;; unknown type +(define-extern citb-sagecage-init-by-other function) +;;(define-extern *green-sagecage-sg* object) ;; unknown type +;;(define-extern citb-sagecage object) ;; unknown type +;;(define-extern *evilsis-citadel-sg* object) ;; unknown type +(define-extern citb-sagecage-update-collision function) +(define-extern yellow-sagecage type) +;;(define-extern *bluesage-sg* object) ;; unknown type +(define-extern red-sagecage type) +;;(define-extern enable-bars object) ;; unknown type +;;(define-extern start-cloning object) ;; unknown type +;;(define-extern disable-bars object) ;; unknown type +;;(define-extern *robotboss-sg* object) ;; unknown type +;;(define-extern spawn-robot object) ;; unknown type +(define-extern snow-bunny-initialize-jump function) +;;(define-extern *snow-bunny-sg* object) ;; unknown type +(define-extern snow-bunny-execute-jump function) +(define-extern snow-bunny-default-event-handler function) +;;(define-extern snow-bunny-retreat-work object) ;; unknown type +;;(define-extern *snow-bunny-nav-enemy-info* object) ;; unknown type +(define-extern snow-bunny type) +;;(define-extern snow-bunny-tune-spheres object) ;; unknown type +;;(define-extern snow-bunny-nav-resume object) ;; unknown type +;;(define-extern snow-bunny-retreat-hop object) ;; unknown type +;;(define-extern snow-bunny-patrol-hop object) ;; unknown type +;;(define-extern *snow-bunny* object) ;; unknown type +;;(define-extern snow-bunny-attack object) ;; unknown type +;;(define-extern snow-bunny-chase-hop object) ;; unknown type +;;(define-extern snow-bunny-patrol-idle object) ;; unknown type +;;(define-extern snow-bunny-lunge object) ;; unknown type +;;(define-extern snow-bunny-defend object) ;; unknown type +;;(define-extern *citb-bunny-sg* object) ;; unknown type +(define-extern citb-bunny type) +;;(define-extern *citb-bunny-nav-enemy-info* object) ;; unknown type +(define-extern citb-drop-plat-spawn-children function) +(define-extern citb-drop-plat-drop-children function) +;;(define-extern drop-plat-spawn object) ;; unknown type +(define-extern drop-plat-init-by-other function) +;;(define-extern drop-plat-idle object) ;; unknown type +(define-extern drop-plat-set-fade function) +;;(define-extern citb-drop-plat-active object) ;; unknown type +;;(define-extern drop-plat-die object) ;; unknown type +;;(define-extern *citb-drop-plat-red-sg* object) ;; unknown type +;;(define-extern drop-plat-drop object) ;; unknown type +;;(define-extern handle-inline-array object) ;; unknown type +;;(define-extern *citb-drop-plat-yellow-sg* object) ;; unknown type +;;(define-extern drop-plat-rise object) ;; unknown type +(define-extern citb-drop-plat type) +(define-extern citb-drop-plat-drop-all-children function) +;;(define-extern drop-plat object) ;; unknown type +;;(define-extern *citb-drop-plat-green-sg* object) ;; unknown type +;;(define-extern *citb-drop-plat-sg* object) ;; unknown type +;;(define-extern citb-drop-plat-idle object) ;; unknown type +;;(define-extern *citb-drop-plat-blue-sg* object) ;; unknown type +;;(define-extern plat-type object) ;; unknown type +;;(define-extern player-stepped object) ;; unknown type +;;(define-extern count object) ;; unknown type +;;(define-extern drop object) ;; unknown type +;;(define-extern *assistant-lavatube-end-sg* object) ;; unknown type +(define-extern assistant-lavatube-end type) +;;(define-extern snow-bunny1 object) ;; unknown type +;;(define-extern snow-bunny2 object) ;; unknown type +;;(define-extern prec-button2 object) ;; unknown type +;;(define-extern irisdoor2 object) ;; unknown type +;;(define-extern assembly-moves object) ;; unknown type +;;(define-extern teleporter-on object) ;; unknown type +;;(define-extern continue-name object) ;; unknown type +;;(define-extern fire-loop object) ;; unknown type +;;(define-extern notice object) ;; unknown type +;;(define-extern robot-arm object) ;; unknown type +;;(define-extern warpgate-loop object) ;; unknown type +(define-extern cavecrystal type) +;;(define-extern *cavecrystal-sg* object) ;; unknown type +;;(define-extern cavecrystal-active object) ;; unknown type +;;(define-extern cavecrystal-idle object) ;; unknown type +;;(define-extern *cavecrystal-light-control* object) ;; unknown type +;;(define-extern bab-spid-dies object) ;; unknown type +;;(define-extern bab-spid-roar object) ;; unknown type +;;(define-extern eggs-hatch object) ;; unknown type +;;(define-extern spider-step object) ;; unknown type +;;(define-extern cavelevator object) ;; unknown type +;;(define-extern cave-spatula object) ;; unknown type +;;(define-extern trapdoor object) ;; unknown type +;;(define-extern mom-spid-dies object) ;; unknown type +;;(define-extern mom-spid-grunt object) ;; unknown type +;;(define-extern spider-mom-t1 object) ;; unknown type +;;(define-extern cavewind object) ;; unknown type +;;(define-extern crystal-light object) ;; unknown type +(define-extern baby-spider type) +(define-extern cave-water type) +(define-extern caveelevator type) +(define-extern cavespatula type) +(define-extern cavetrapdoor type) +(define-extern dark-crystal type) +(define-extern static-screen-spawn function) +;;(define-extern static-screen object) ;; unknown type +(define-extern static-screen-init-by-other function) +;;(define-extern robotboss-dda object) ;; unknown type +(define-extern target-has-all-the-cells? function) +(define-extern check-drop-level-eichar-lighteco-pops function) +(define-extern check-drop-level-bigdoor-open-pops function) +;;(define-extern light-eco-mother-active object) ;; unknown type +(define-extern light-eco-child-init-by-other function) +(define-extern check-drop-level-lighteco-big-pops function) +;;(define-extern light-eco-child-appear object) ;; unknown type +;;(define-extern light-eco-child-grabbed object) ;; unknown type +(define-extern check-drop-level-lighteco-pops function) +;;(define-extern light-eco-child-die object) ;; unknown type +(define-extern light-eco-mother-init-by-other function) +(define-extern light-eco-mother-default-event-handler function) +;;(define-extern *light-eco-big-sg* object) ;; unknown type +;;(define-extern light-eco-mother object) ;; unknown type +;;(define-extern light-eco-mother-discipate object) ;; unknown type +;;(define-extern light-eco-child object) ;; unknown type +;;(define-extern light-eco-mother-appear object) ;; unknown type +;;(define-extern light-eco-child-hit-ground object) ;; unknown type +;;(define-extern *light-eco-small-sg* object) ;; unknown type +;;(define-extern light-eco-child-idle object) ;; unknown type +(define-extern light-eco-child-default-event-handler function) +;;(define-extern white-eco-picked-up object) ;; unknown type +;;(define-extern beam-off object) ;; unknown type +;;(define-extern darkecobomb object) ;; unknown type +(define-extern darkecobomb-init-by-other function) +(define-extern arcing-shot-setup function) +;;(define-extern darkecobomb-countdown object) ;; unknown type +;;(define-extern arcing-shot-debug-trajectory object) ;; unknown type +;;(define-extern torus-verts object) ;; unknown type +;;(define-extern greenshot object) ;; unknown type +(define-extern darkecobomb-explode-if-player-high-enough function) +;;(define-extern *greenshot-sg* object) ;; unknown type +;;(define-extern darkecobomb-explode object) ;; unknown type +(define-extern redshot-init-by-other function) +(define-extern arcing-shot-calculate function) +;;(define-extern redshot-explode object) ;; unknown type +(define-extern redshot-particle-callback function) +(define-extern darkecobomb-handler function) +;;(define-extern yellowshot object) ;; unknown type +;;(define-extern yellowshot-idle object) ;; unknown type +;;(define-extern redshot object) ;; unknown type +(define-extern yellowshot-init-by-other function) +(define-extern greenshot-init-by-other function) +;;(define-extern greenshot-idle object) ;; unknown type +;;(define-extern arcing-shot object) ;; unknown type +;;(define-extern darkecobomb-idle object) ;; unknown type +;;(define-extern torus object) ;; unknown type +(define-extern redshot-trans function) +;;(define-extern *redring-sg* object) ;; unknown type +;;(define-extern darkecobomb-land object) ;; unknown type +(define-extern arcing-shot-draw function) +(define-extern redshot-handler function) +;;(define-extern *darkecobomb-sg* object) ;; unknown type +;;(define-extern redshot-idle object) ;; unknown type +;;(define-extern redshot-wait object) ;; unknown type +;;(define-extern bomb-going object) ;; unknown type +;;(define-extern flash object) ;; unknown type +;;(define-extern hit-jak object) ;; unknown type +;;(define-extern bomb-done object) ;; unknown type +;;(define-extern missed-jak object) ;; unknown type +;;(define-extern ecoclaw-activate object) ;; unknown type +(define-extern ecoclaw-beam-particle-callback function) +;;(define-extern ecoclaw-part-info object) ;; unknown type +(define-extern ecoclaw type) +(define-extern ecoclaw-handler function) +;;(define-extern *silodoor-sg* object) ;; unknown type +(define-extern finalbosscam-init-by-other function) +;;(define-extern finalbosscam object) ;; unknown type +;;(define-extern *ecoclaw-sg* object) ;; unknown type +;;(define-extern ecoclaw-idle object) ;; unknown type +;;(define-extern *finalbosscam-sg* object) ;; unknown type +(define-extern robotboss-manipy-trans-hook function) +;;(define-extern *med-res-snow1-sg* object) ;; unknown type +(define-extern silodoor type) +;;(define-extern set-pivot object) ;; unknown type +;;(define-extern *ecoclaw* object) ;; unknown type +;;(define-extern beam-on object) ;; unknown type +;;(define-extern green-eco-lurker object) ;; unknown type +;;(define-extern *green-eco-lurker-sg* object) ;; unknown type +(define-extern green-eco-lurker-gen-init-by-other function) +;;(define-extern *green-eco-lurker-nav-enemy-info* object) ;; unknown type +;;(define-extern green-eco-lurker-gen object) ;; unknown type +;;(define-extern green-eco-lurker-appear object) ;; unknown type +;;(define-extern green-eco-lurker-wait-to-appear object) ;; unknown type +(define-extern green-eco-lurker-init-by-other function) +;;(define-extern green-eco-lurker-appear-land object) ;; unknown type +;;(define-extern spawn-minions object) ;; unknown type +;;(define-extern green-eco-lurker-tune-spheres object) ;; unknown type +;;(define-extern blob-died object) ;; unknown type +;;(define-extern blob-hit-jak object) ;; unknown type +;;(define-extern redshot-launch-info object) ;; unknown type +;;(define-extern redshot-launch-array object) ;; unknown type +;;(define-extern *robotboss-redeco-sg* object) ;; unknown type +(define-extern robotboss-yellow-eco-off function) +(define-extern robotboss-yellow-eco-on function) +(define-extern robotboss-anim-blend-loop function) +;;(define-extern robotboss-red-dark-bomb-wait object) ;; unknown type +;;(define-extern robotboss-green object) ;; unknown type +(define-extern robotboss-yellowshot function) +(define-extern robotboss-bomb-handler function) +;;(define-extern robotboss-green-dark-bomb-wait object) ;; unknown type +(define-extern robotboss-greenshot function) +(define-extern robotboss-always-trans function) +;;(define-extern robotboss-green-wait object) ;; unknown type +;;(define-extern robotboss-daxter-sacrifice-movie object) ;; unknown type +(define-extern robotboss-blue-done function) +;;(define-extern robotboss-red object) ;; unknown type +;;(define-extern robotboss-blue-wait object) ;; unknown type +;;(define-extern robotboss-yellow object) ;; unknown type +;;(define-extern robotboss-green-dark-bomb object) ;; unknown type +(define-extern robotboss-is-red-hit function) +(define-extern robotboss-redshot function) +(define-extern robotboss-is-yellow-hit function) +;;(define-extern robotboss-red-dark-bomb object) ;; unknown type +;;(define-extern robotboss-blue-dark-bomb object) ;; unknown type +(define-extern robotboss-position function) +(define-extern robotboss-blue-beam function) +;;(define-extern *robotboss-blueeco-sg* object) ;; unknown type +(define-extern robotboss-time-to-shoot-yellow function) +;;(define-extern *robotboss-yelloweco-sg* object) ;; unknown type +(define-extern robotboss-shooting-trans function) +(define-extern robotboss-cut-cam function) +;;(define-extern robotboss-yellow-dark-bomb-wait object) ;; unknown type +(define-extern robotboss-cut-cam-exit function) +;;(define-extern robotboss-yellow-wait object) ;; unknown type +(define-extern robotboss-darkecobomb function) +;;(define-extern robotboss-yellow-dark-bomb object) ;; unknown type +(define-extern robotboss-redshot-fill-array function) +(define-extern robotboss-set-dda function) +;;(define-extern robotboss-white-eco-movie object) ;; unknown type +(define-extern robotboss-setup-for-hits function) +;;(define-extern robotboss-red-wait object) ;; unknown type +;;(define-extern robotboss-blue-dark-bomb-wait object) ;; unknown type +(define-extern robotboss-handler function) +(define-extern power-left type) +;;(define-extern *powercellalt-sg* object) ;; unknown type +;;(define-extern powercellalt object) ;; unknown type +;;(define-extern *power-left-sg* object) ;; unknown type +;;(define-extern *power-right-sg* object) ;; unknown type +(define-extern power-right type) +;;(define-extern fin-door object) ;; unknown type +(define-extern powercellalt-init-by-other function) +;;(define-extern brightness object) ;; unknown type +;;(define-extern *robotboss-cinematic-sg* object) ;; unknown type +;;(define-extern *plat-eco-finalboss-unlit-sg* object) ;; unknown type +;;(define-extern sage-finalboss-credits object) ;; unknown type +;;(define-extern sage-finalboss-particle object) ;; unknown type +(define-extern sage-finalboss-extra-enter function) +;;(define-extern *plat-eco-finalboss-lit-sg* object) ;; unknown type +;;(define-extern *jak-white-sg* object) ;; unknown type +(define-extern sage-finalboss-extra-trans function) +(define-extern sage-finalboss-credit-particle function) +(define-extern plat-eco-finalboss type) +;;(define-extern *sage-finalboss-sg* object) ;; unknown type +(define-extern ogreboss type) +;;(define-extern activate-particle object) ;; unknown type +;;(define-extern deactivate-particle object) ;; unknown type +;;(define-extern babak-alarmed object) ;; unknown type +;;(define-extern blob-dies object) ;; unknown type +;;(define-extern blob-land object) ;; unknown type +;;(define-extern blob-roar object) ;; unknown type +;;(define-extern bfg-fizzle object) ;; unknown type +;;(define-extern dark-eco-buzz object) ;; unknown type +;;(define-extern dark-eco-fire object) ;; unknown type +;;(define-extern explod-bfg object) ;; unknown type +;;(define-extern explosion2 object) ;; unknown type +;;(define-extern robo-servo2 object) ;; unknown type +;;(define-extern robo-servo3 object) ;; unknown type +;;(define-extern robo-servo5 object) ;; unknown type +;;(define-extern robo-servo6 object) ;; unknown type +;;(define-extern robo-servo9 object) ;; unknown type +;;(define-extern robo-yell object) ;; unknown type +;;(define-extern *evilbro-intro-sg* object) ;; unknown type +(define-extern evilsis type) +;;(define-extern *evilsis-intro-sg* object) ;; unknown type +(define-extern evilbro type) +(define-extern misty-part type) +;;(define-extern eggtop-idle object) ;; unknown type +(define-extern eggtop type) +;;(define-extern eggtop-close object) ;; unknown type +;;(define-extern *jng-iris-door-sg* object) ;; unknown type +;;(define-extern *eggtop-sg* object) ;; unknown type +(define-extern jng-iris-door type) +(define-extern plat-flip type) +;;(define-extern *plat-flip-sg* object) ;; unknown type +;;(define-extern plat-flip-idle object) ;; unknown type +;;(define-extern sync-percent object) ;; unknown type +;;(define-extern *aphid-sg* object) ;; unknown type +(define-extern aphid-vulnerable function) +;;(define-extern aphid object) ;; unknown type +(define-extern aphid-init-by-other function) +;;(define-extern *aphid-nav-enemy-info* object) ;; unknown type +(define-extern aphid-invulnerable function) +;;(define-extern plant-boss-root-idle object) ;; unknown type +;;(define-extern plant-boss-intro object) ;; unknown type +;;(define-extern plant-boss-reset object) ;; unknown type +;;(define-extern plant-boss-root-die object) ;; unknown type +;;(define-extern plant-boss-dead-bounce object) ;; unknown type +;;(define-extern plant-boss-dead-idle object) ;; unknown type +(define-extern plant-boss-back-arms-init function) +;;(define-extern plant-boss-vulnerable object) ;; unknown type +;;(define-extern plant-boss-spawn object) ;; unknown type +;;(define-extern plant-boss-hit object) ;; unknown type +(define-extern plant-boss-root-init function) +;;(define-extern *plant-boss-vine-sg* object) ;; unknown type +;;(define-extern *plant-boss-back-arms-sg* object) ;; unknown type +;;(define-extern plant-boss-arm object) ;; unknown type +;;(define-extern plant-boss-back-arms-hit object) ;; unknown type +;;(define-extern plant-boss-vine-idle object) ;; unknown type +;;(define-extern *plant-boss-sg* object) ;; unknown type +(define-extern plant-boss-vine-init function) +;;(define-extern *plant-boss-shadow-control* object) ;; unknown type +;;(define-extern *plant-boss-leaf-sg* object) ;; unknown type +;;(define-extern plant-boss-idle object) ;; unknown type +(define-extern plant-boss-generic-event-handler function) +;;(define-extern plant-boss-arm-hit object) ;; unknown type +;;(define-extern plant-boss-arm-die object) ;; unknown type +;;(define-extern plant-boss-leaf object) ;; unknown type +;;(define-extern plant-boss-vine-hit object) ;; unknown type +;;(define-extern plant-boss-leaf-open object) ;; unknown type +(define-extern plant-boss-leaf-init function) +;;(define-extern plant-boss-eat object) ;; unknown type +(define-extern plant-boss-default-event-handler function) +;;(define-extern *plant-boss-arm-sg* object) ;; unknown type +;;(define-extern plant-boss-back-arms-die object) ;; unknown type +;;(define-extern plant-boss-attack object) ;; unknown type +(define-extern plant-boss-post function) +;;(define-extern *plant-boss-root-sg* object) ;; unknown type +;;(define-extern plant-boss-leaf-idle object) ;; unknown type +;;(define-extern plant-boss-leaf-die object) ;; unknown type +(define-extern plant-boss-arm-init function) +;;(define-extern plant-boss-dead object) ;; unknown type +;;(define-extern plant-boss-leaf-bounce object) ;; unknown type +;;(define-extern plant-boss-leaf-close object) ;; unknown type +;;(define-extern plant-boss-far-idle object) ;; unknown type +;;(define-extern plant-boss-back-arms-idle object) ;; unknown type +;;(define-extern plant-boss-leaf-open-idle object) ;; unknown type +;;(define-extern plant-boss-arm-idle object) ;; unknown type +;;(define-extern plant-boss-vine-die object) ;; unknown type +;;(define-extern hit object) ;; unknown type +;;(define-extern aphid-dies object) ;; unknown type +;;(define-extern aphid-roar object) ;; unknown type +;;(define-extern aphid-step object) ;; unknown type +;;(define-extern darkvine-down object) ;; unknown type +;;(define-extern darkvine-move object) ;; unknown type +;;(define-extern darkvine-up object) ;; unknown type +;;(define-extern irisdoor1 object) ;; unknown type +;;(define-extern plant-chomp object) ;; unknown type +;;(define-extern plant-eye object) ;; unknown type +;;(define-extern plant-fall object) ;; unknown type +;;(define-extern plant-laugh object) ;; unknown type +;;(define-extern plant-ouch object) ;; unknown type +;;(define-extern plant-recover object) ;; unknown type +;;(define-extern plant-roar object) ;; unknown type +;;(define-extern extra-count object) ;; unknown type +(define-extern darkvine type) +(define-extern jungle-elevator type) +;;(define-extern bouncer-smush object) ;; unknown type +;;(define-extern bouncer-fire object) ;; unknown type +;;(define-extern bouncer-wait object) ;; unknown type +;;(define-extern *bouncer-sg* object) ;; unknown type +;;(define-extern *hopper-nav-enemy-info* object) ;; unknown type +(define-extern hopper-do-jump function) +(define-extern hopper-jump-to function) +(define-extern hopper type) +;;(define-extern *hopper-sg* object) ;; unknown type +(define-extern hopper-find-ground function) +;;(define-extern junglesnake-tilt-joint object) ;; unknown type +;;(define-extern junglesnake-tracking object) ;; unknown type +;;(define-extern *junglesnake-twist-max-deltas* object) ;; unknown type +(define-extern junglesnake-default-event-handler function) +(define-extern junglesnake type) +;;(define-extern junglesnake-wake object) ;; unknown type +;;(define-extern junglesnake-die object) ;; unknown type +;;(define-extern junglesnake-attack object) ;; unknown type +;;(define-extern junglesnake-sleeping object) ;; unknown type +(define-extern junglesnake-joint-callback function) +;;(define-extern junglesnake-give-up object) ;; unknown type +;;(define-extern junglesnake-twist-joint object) ;; unknown type +;;(define-extern *junglesnake-sg* object) ;; unknown type +;;(define-extern *darkvine-sg* object) ;; unknown type +;;(define-extern darkvine-idle object) ;; unknown type +(define-extern darkvine-event-handler function) +;;(define-extern darkvine-retreat object) ;; unknown type +;;(define-extern darkvine-die object) ;; unknown type +;;(define-extern precurbridge-idle object) ;; unknown type +;;(define-extern *maindoor-sg* object) ;; unknown type +(define-extern lurkerm-tall-sail type) +;;(define-extern precurbridge-span object) ;; unknown type +;;(define-extern precurbridge-active object) ;; unknown type +;;(define-extern lurkerm-tall-sail-idle object) ;; unknown type +;;(define-extern *lurkerm-tall-sail-sg* object) ;; unknown type +(define-extern logtrap type) +;;(define-extern *accordian-sg* object) ;; unknown type +(define-extern accordian type) +;;(define-extern lurkerm-short-sail-idle object) ;; unknown type +(define-extern maindoor type) +;;(define-extern maindoor-closed object) ;; unknown type +;;(define-extern *logtrap-sg* object) ;; unknown type +;;(define-extern *junglecam-sg* object) ;; unknown type +;;(define-extern *med-res-firecanyon-sg* object) ;; unknown type +;;(define-extern *jungle-camera-sg* object) ;; unknown type +(define-extern precurbridge type) +(define-extern lurkerm-piston type) +;;(define-extern *sidedoor-sg* object) ;; unknown type +;;(define-extern jngpusher-idle object) ;; unknown type +;;(define-extern precurbridge-activate object) ;; unknown type +;;(define-extern lurkerm-short-sail object) ;; unknown type +(define-extern sidedoor type) +(define-extern junglecam type) +;;(define-extern *towertop-sg* object) ;; unknown type +(define-extern towertop type) +;;(define-extern accordian-idle object) ;; unknown type +(define-extern jungle-water type) +;;(define-extern *lurkerm-piston-sg* object) ;; unknown type +;;(define-extern towertop-idle object) ;; unknown type +;;(define-extern *jngpusher-sg* object) ;; unknown type +;;(define-extern *lurkerm-short-sail-sg* object) ;; unknown type +;;(define-extern precurbridgecam object) ;; unknown type +;;(define-extern maindoor-open object) ;; unknown type +;;(define-extern lurkerm-piston-idle object) ;; unknown type +;;(define-extern ripple-for-jungle-water object) ;; unknown type +;;(define-extern *precurbridge-sg* object) ;; unknown type +;;(define-extern jngpusher object) ;; unknown type +(define-extern peri-beamcam-init-by-other function) +;;(define-extern reflector object) ;; unknown type +;;(define-extern periscope-activate object) ;; unknown type +;;(define-extern reflector-mirror-idle object) ;; unknown type +(define-extern reflector-init-by-other function) +(define-extern periscope-debug-trans function) +;;(define-extern *reflector-mirror-sg* object) ;; unknown type +(define-extern periscope-post function) +(define-extern periscope-has-power-input? function) +(define-extern periscope-test-task-complete? function) +(define-extern periscope-update-joints function) +;;(define-extern reflector-idle object) ;; unknown type +(define-extern periscope-draw-beam function) +;;(define-extern *periscope-base-sg* object) ;; unknown type +;;(define-extern *periscope-mirror-sg* object) ;; unknown type +(define-extern reflector-origin-update function) +;;(define-extern periscope-idle object) ;; unknown type +(define-extern reflector-origin type) +;;(define-extern cam-periscope object) ;; unknown type +;;(define-extern periscope-player-control object) ;; unknown type +;;(define-extern periscope-wait-for-player object) ;; unknown type +(define-extern periscope-crosshair function) +(define-extern periscope-find-aim-at-angles function) +(define-extern periscope-find-next function) +(define-extern draw-power-beam function) +(define-extern periscope-set-target-direction function) +(define-extern periscope-find-reflection-angles function) +;;(define-extern periscope-power-on object) ;; unknown type +(define-extern reflector-mirror type) +(define-extern periscope-draw-beam-impact function) +;;(define-extern periscope-wait-for-power-input object) ;; unknown type +;;(define-extern *reflector-mirror-break-sg* object) ;; unknown type +(define-extern target-close-to-point? function) +;;(define-extern reflector-origin-idle object) ;; unknown type +;;(define-extern reflector-mirror-broken object) ;; unknown type +;;(define-extern activate object) ;; unknown type +(define-extern junglefish type) +;;(define-extern *junglefish-sg* object) ;; unknown type +;;(define-extern *junglefish-nav-enemy-info* object) ;; unknown type +(define-extern fisher-fish-move function) +(define-extern fisher-spawn-ambient function) +;;(define-extern *fish-net-sg* object) ;; unknown type +;;(define-extern fisher-fish-die object) ;; unknown type +;;(define-extern *fisher-sg* object) ;; unknown type +;;(define-extern *catch-fishc-sg* object) ;; unknown type +;;(define-extern *fisher-params* object) ;; unknown type +;;(define-extern *catch-fisha-sg* object) ;; unknown type +(define-extern fisher-game-update function) +;;(define-extern fisher-fish-fall object) ;; unknown type +;;(define-extern fisher-fish-caught object) ;; unknown type +;;(define-extern fisher-fish object) ;; unknown type +;;(define-extern fisher-params object) ;; unknown type +;;(define-extern fisher-done object) ;; unknown type +(define-extern fisher-fish-water function) +(define-extern fisher-bank type) +;;(define-extern *catch-fishb-sg* object) ;; unknown type +(define-extern fisher-fish-init-by-other function) +;;(define-extern fisher-playing object) ;; unknown type +(define-extern fisher-draw-display function) +;;(define-extern *FISHER-bank* object) ;; unknown type +(define-extern fisher type) +;;(define-extern emissive-off object) ;; unknown type +;;(define-extern bounce object) ;; unknown type +;;(define-extern emissive-on object) ;; unknown type +;;(define-extern bad object) ;; unknown type +;;(define-extern fishgame object) ;; unknown type +(define-extern jungle-part type) +;;(define-extern launcherdoor-closed object) ;; unknown type +;;(define-extern *launcherdoor-maincave-sg* object) ;; unknown type +;;(define-extern *launcherdoor-sg* object) ;; unknown type +;;(define-extern launcherdoor-open object) ;; unknown type +(define-extern launcherdoor type) +;;(define-extern accordian-pump object) ;; unknown type +;;(define-extern bounceytarp object) ;; unknown type +;;(define-extern frog-dies object) ;; unknown type +;;(define-extern frog-idle object) ;; unknown type +;;(define-extern frog-jump object) ;; unknown type +;;(define-extern frogspeak object) ;; unknown type +;;(define-extern lurkerfish-bite object) ;; unknown type +;;(define-extern lurkerfish-dies object) ;; unknown type +;;(define-extern lurkerfish-swim object) ;; unknown type +;;(define-extern snake-bite object) ;; unknown type +;;(define-extern snake-idle object) ;; unknown type +;;(define-extern snake-rattle object) ;; unknown type +;;(define-extern logtrap1 object) ;; unknown type +;;(define-extern logtrap2 object) ;; unknown type +;;(define-extern lurkerm-squeak object) ;; unknown type +;;(define-extern prec-button3 object) ;; unknown type +;;(define-extern pc-bridge object) ;; unknown type +;;(define-extern floating-rings object) ;; unknown type +;;(define-extern bridge-hover object) ;; unknown type +;;(define-extern heart-drone object) ;; unknown type +;;(define-extern jungle-river object) ;; unknown type +;;(define-extern jungle-shores object) ;; unknown type +;;(define-extern lurkerm-hum object) ;; unknown type +;;(define-extern steam-release object) ;; unknown type +;;(define-extern wind-loop object) ;; unknown type +(define-extern racer-bank type) +;;(define-extern racer-info object) ;; unknown type +;;(define-extern *balloon-sg* object) ;; unknown type +;;(define-extern *RACER-bank* object) ;; unknown type +(define-extern zoomer-heat-slice-color function) +(define-extern part-hud-zoomer-heat-slice-03-func function) +;;(define-extern hud-bike-speed object) ;; unknown type +(define-extern part-hud-racer-speed-func function) +(define-extern part-hud-zoomer-heat-slice-02-func function) +(define-extern part-hud-racer-heat-func function) +(define-extern part-hud-zoomer-heat-slice-01-func function) +;;(define-extern hud-bike-heat object) ;; unknown type +(define-extern racer-effect function) +;;(define-extern *racer-explode-sg* object) ;; unknown type +;;(define-extern *racer-shadow-control* object) ;; unknown type +;;(define-extern *racer-sg* object) ;; unknown type +;;(define-extern wait-for-start object) ;; unknown type +(define-extern blocking-plane-destroy function) +(define-extern blocking-plane-spawn function) +;;(define-extern wait-for-return object) ;; unknown type +(define-extern racer-on-ground? function) +(define-extern racer-xz function) +;;(define-extern *racer-air-mods* object) ;; unknown type +(define-extern racer-collision function) +(define-extern racer-sounds function) +(define-extern racer-find-prop-point function) +(define-extern target-racing-turn-anim function) +(define-extern racer-integrate function) +(define-extern racer-effects function) +(define-extern racer-service-slide function) +(define-extern target-racing-post function) +(define-extern racer-buzz function) +(define-extern target-racing-center-anim function) +(define-extern racer-cushion function) +(define-extern racer-thrust function) +;;(define-extern *racer-mods* object) ;; unknown type +(define-extern target-racing-land-anim function) +(define-extern target-racing-jump-anim function) +(define-extern racer-calc-gravity function) +(define-extern racer-bend-gravity function) +;;(define-extern target-racing-falling object) ;; unknown type +;;(define-extern target-racing-jump object) ;; unknown type +;;(define-extern target-racing-bounce object) ;; unknown type +(define-extern racer-collision-reaction function) +;;(define-extern boost object) ;; unknown type +;;(define-extern target-racing-smack object) ;; unknown type +;;(define-extern target-racing object) ;; unknown type +;;(define-extern target-racing-death object) ;; unknown type +;;(define-extern target-racing-grab object) ;; unknown type +(define-extern target-racing-smack-check function) +;;(define-extern target-racing-get-on object) ;; unknown type +;;(define-extern target-racing-get-off-jump object) ;; unknown type +;;(define-extern target-racing-clone-anim object) ;; unknown type +;;(define-extern target-racing-get-off object) ;; unknown type +;;(define-extern target-racing-get-off-hit-ground object) ;; unknown type +;;(define-extern target-racing-hit object) ;; unknown type +(define-extern balloonlurker type) +;;(define-extern smack object) ;; unknown type +;;(define-extern group-target-hit object) ;; unknown type +;;(define-extern *ef-plane-sg* object) ;; unknown type +;;(define-extern blocking-plane-idle object) ;; unknown type +(define-extern blocking-plane-init-by-other function) +;;(define-extern blocking-plane object) ;; unknown type +(define-extern flutflut-effect function) +(define-extern flutflut type) +;;(define-extern *flutflut-shadow-control* object) ;; unknown type +;;(define-extern *flutflut-sg* object) ;; unknown type +(define-extern target-flut-hit-ground-anim function) +;;(define-extern target-flut-get-on object) ;; unknown type +;;(define-extern target-flut-air-attack-hit-ground object) ;; unknown type +;;(define-extern *flut-walk-mods* object) ;; unknown type +(define-extern target-flut-dangerous-event-handler function) +;;(define-extern target-flut-hit object) ;; unknown type +(define-extern target-flut-standard-event-handler function) +;;(define-extern target-flut-stance object) ;; unknown type +;;(define-extern target-flut-hit-ground object) ;; unknown type +(define-extern flut-bank type) +(define-extern target-flut-post-post function) +;;(define-extern target-flut-grab object) ;; unknown type +;;(define-extern target-flut-falling object) ;; unknown type +;;(define-extern target-flut-death object) ;; unknown type +;;(define-extern target-flut-air-attack object) ;; unknown type +;;(define-extern *flut-air-attack-mods* object) ;; unknown type +;;(define-extern *flut-jump-mods* object) ;; unknown type +;;(define-extern target-flut-double-jump object) ;; unknown type +;;(define-extern flut-info object) ;; unknown type +(define-extern target-flut-falling-anim-trans function) +;;(define-extern target-flut-get-off-jump object) ;; unknown type +;;(define-extern target-flut-jump object) ;; unknown type +;;(define-extern target-flut-walk object) ;; unknown type +(define-extern target-flut-post function) +;;(define-extern *flut-double-jump-mods* object) ;; unknown type +;;(define-extern target-flut-get-off object) ;; unknown type +;;(define-extern target-flut-running-attack object) ;; unknown type +;;(define-extern *flut-run-attack-mods* object) ;; unknown type +;;(define-extern *FLUT-bank* object) ;; unknown type +;;(define-extern target-flut-get-off-hit-ground object) ;; unknown type +;;(define-extern target-flut-clone-anim object) ;; unknown type +;;(define-extern group-flut-attack-strike-ground object) ;; unknown type +;;(define-extern flut-death object) ;; unknown type +;;(define-extern long-jump object) ;; unknown type +;;(define-extern *farmer-sg* object) ;; unknown type +(define-extern farmer type) +(define-extern explorer type) +;;(define-extern *explorer-sg* object) ;; unknown type +;;(define-extern *assistant-sg* object) ;; unknown type +(define-extern assistant type) +(define-extern check-drop-level-assistant function) +(define-extern sage type) +;;(define-extern *sage-sg* object) ;; unknown type +;;(define-extern yakow-kicked object) ;; unknown type +;;(define-extern yakow-idle object) ;; unknown type +;;(define-extern yakow-walk-to object) ;; unknown type +(define-extern yakow-common-post function) +;;(define-extern *yakow-sg* object) ;; unknown type +(define-extern yakow-bank type) +(define-extern yakow-post function) +(define-extern yakow-facing-player? function) +;;(define-extern *YAKOW-bank* object) ;; unknown type +;;(define-extern yakow-notice object) ;; unknown type +(define-extern yakow-blend-walk-run function) +;;(define-extern *village1cam-sg* object) ;; unknown type +(define-extern yakow-facing-point? function) +;;(define-extern yakow-graze-kicked object) ;; unknown type +(define-extern yakow-run-post function) +;;(define-extern yakow-run-away object) ;; unknown type +(define-extern yakow-simple-post function) +;;(define-extern yakow-graze object) ;; unknown type +(define-extern yakow-facing-direction? function) +;;(define-extern yakow-die object) ;; unknown type +(define-extern yakow-default-event-handler function) +(define-extern yakow-task-complete? function) +(define-extern yakow-cam function) +(define-extern yakow type) +(define-extern yakow-generate-travel-vector function) +;;(define-extern yakow-2 object) ;; unknown type +;;(define-extern yakow-1 object) ;; unknown type +;;(define-extern hutlamp-idle object) ;; unknown type +(define-extern revcycleprop type) +;;(define-extern *hutlamp-sg* object) ;; unknown type +;;(define-extern windmill-sail-idle object) ;; unknown type +;;(define-extern *med-res-village13-sg* object) ;; unknown type +;;(define-extern starfish object) ;; unknown type +(define-extern reflector-middle type) +;;(define-extern *starfish-sg* object) ;; unknown type +;;(define-extern starfish-patrol object) ;; unknown type +;;(define-extern *med-res-training-sg* object) ;; unknown type +;;(define-extern villa-starfish-idle object) ;; unknown type +;;(define-extern *med-res-beach3-sg* object) ;; unknown type +(define-extern windmill-sail type) +;;(define-extern *windmill-sail-sg* object) ;; unknown type +;;(define-extern mayorgears-idle object) ;; unknown type +(define-extern villa-starfish type) +;;(define-extern sagesail-idle object) ;; unknown type +;;(define-extern *med-res-beach-sg* object) ;; unknown type +;;(define-extern village-fish object) ;; unknown type +;;(define-extern *reflector-middle-sg* object) ;; unknown type +(define-extern hutlamp type) +(define-extern update-clock function) +;;(define-extern *revcycleprop-sg* object) ;; unknown type +(define-extern starfish-spawn-child function) +;;(define-extern villa-fisha object) ;; unknown type +;;(define-extern cyclegen object) ;; unknown type +(define-extern revcycle type) +;;(define-extern windspinner-idle object) ;; unknown type +;;(define-extern villa-fishb object) ;; unknown type +;;(define-extern *mayorgears-sg* object) ;; unknown type +(define-extern process-drawable-child-count function) +;;(define-extern ripple-for-villagea-water object) ;; unknown type +(define-extern sagesail type) +;;(define-extern *revcycle-sg* object) ;; unknown type +;;(define-extern village-fish-idle object) ;; unknown type +;;(define-extern reflector-middle-idle object) ;; unknown type +(define-extern starfish-init-by-other function) +;;(define-extern *med-res-village11-sg* object) ;; unknown type +(define-extern villagea-water type) +;;(define-extern *med-res-beach1-sg* object) ;; unknown type +(define-extern reflector-end type) +;;(define-extern *med-res-jungle1-sg* object) ;; unknown type +;;(define-extern *med-res-jungle2-sg* object) ;; unknown type +;;(define-extern reflector-end-idle object) ;; unknown type +;;(define-extern *sagesail-sg* object) ;; unknown type +(define-extern set-period function) +;;(define-extern *med-res-jungle-sg* object) ;; unknown type +;;(define-extern *starfish-nav-enemy-info* object) ;; unknown type +;;(define-extern *med-res-village12-sg* object) ;; unknown type +;;(define-extern *med-res-misty-sg* object) ;; unknown type +;;(define-extern starfish-idle object) ;; unknown type +;;(define-extern *med-res-beach2-sg* object) ;; unknown type +(define-extern windspinner type) +;;(define-extern *windspinner-sg* object) ;; unknown type +(define-extern mayorgears type) +;;(define-extern fishermans-boat-player-control object) ;; unknown type +;;(define-extern fishermans-boat-measurements object) ;; unknown type +(define-extern fishermans-boat-play-sounds function) +(define-extern fishermans-boat-reset-physics function) +(define-extern fishermans-boat type) +(define-extern fishermans-boat-set-dock-point function) +;;(define-extern vehicle-path object) ;; unknown type +;;(define-extern *boat-throttle-control-table* object) ;; unknown type +;;(define-extern fishermans-boat-ride-to-village1 object) ;; unknown type +;;(define-extern *fb-evilsis-sg* object) ;; unknown type +;;(define-extern *boat-turning-radius-table* object) ;; unknown type +(define-extern fishermans-boat-wave function) +(define-extern fishermans-boat-enter-dock? function) +;;(define-extern boat-stabilizer object) ;; unknown type +;;(define-extern fishermans-boat-entering-village object) ;; unknown type +;;(define-extern *fishermans-boat-constants* object) ;; unknown type +(define-extern fishermans-boat-set-throttle-by-speed function) +(define-extern fishermans-boat-post function) +(define-extern fishermans-boat-set-path-point function) +;;(define-extern fishermans-boat-docked-village object) ;; unknown type +(define-extern fishermans-boat-leave-dock? function) +(define-extern fishermans-boat-spawn-particles function) +;;(define-extern *fb-evilbro-sg* object) ;; unknown type +;;(define-extern fishermans-boat-entering-misty object) ;; unknown type +;;(define-extern *fishermans-boat-sg* object) ;; unknown type +;;(define-extern fishermans-boat-leaving-misty object) ;; unknown type +;;(define-extern vehicle-controller object) ;; unknown type +;;(define-extern fishermans-boat-docked-misty object) ;; unknown type +;;(define-extern fishermans-boat-ride-to-misty object) ;; unknown type +;;(define-extern fishermans-boat-leaving-village object) ;; unknown type +(define-extern fishermans-boat-next-path-point function) +(define-extern bird-bob-func function) +(define-extern villagea-part type) +(define-extern check-drop-level-village1-fountain-nosplash function) +(define-extern check-drop-level-village1-fountain function) +(define-extern sparticle-seagull-moon function) +(define-extern check-drop-level-sagehut function) +;;(define-extern sequenceA-village1 object) ;; unknown type +(define-extern sequenceA-village1-init-by-other function) +(define-extern sequenceA-village1-trans-hook function) +;;(define-extern sidekick-human object) ;; unknown type +;;(define-extern *sidekick-human-sg* object) ;; unknown type +;;(define-extern *tra-pontoon-sg* object) ;; unknown type +;;(define-extern *training-cam-sg* object) ;; unknown type +;;(define-extern *scarecrow-a-sg* object) ;; unknown type +(define-extern scarecrow-a type) +(define-extern tra-pontoon type) +(define-extern tra-iris-door type) +(define-extern training-cam type) +(define-extern scarecrow-b type) +;;(define-extern *scarecrow-a-break-sg* object) ;; unknown type +;;(define-extern *scarecrow-b-break-sg* object) ;; unknown type +;;(define-extern ripple-for-training-water object) ;; unknown type +;;(define-extern *scarecrow-b-sg* object) ;; unknown type +(define-extern training-water type) +;;(define-extern *tra-iris-door-sg* object) ;; unknown type +;;(define-extern *tra-pontoon-constants* object) ;; unknown type +;;(define-extern group-scarecrow-explode object) ;; unknown type +;;(define-extern group-scarecrow-hit object) ;; unknown type +;;(define-extern group-scarecrow-joint-explode object) ;; unknown type +(define-extern check-drop-level-training-spout-rain function) +(define-extern check-drop-level-training-mist function) +(define-extern tra-sparticle-seagull-moon function) +(define-extern training-part type) +(define-extern tra-bird-bob-func function) +(define-extern breakaway-left type) +(define-extern misty-cam-restore function) +(define-extern actor-wait-for-period function) +(define-extern mistycam type) +(define-extern boatpaddle type) +;;(define-extern breakaway-about-to-fall object) ;; unknown type +(define-extern mis-bone-bridge type) +;;(define-extern *breakaway-left-sg* object) ;; unknown type +(define-extern boat-fuelcell type) +;;(define-extern mis-bone-bridge-idle object) ;; unknown type +;;(define-extern *bone-platform-constants* object) ;; unknown type +;;(define-extern *mis-bone-platform-sg* object) ;; unknown type +;;(define-extern *breakaway-mid-sg* object) ;; unknown type +;;(define-extern mis-bone-bridge-hit object) ;; unknown type +(define-extern breakaway-right type) +;;(define-extern breakaway-fall object) ;; unknown type +;;(define-extern breakaway object) ;; unknown type +(define-extern breakaway-mid type) +;;(define-extern mis-bone-bridge-bump object) ;; unknown type +(define-extern bone-platform type) +;;(define-extern mis-bone-bridge-fall object) ;; unknown type +;;(define-extern boat-fuelcell-die object) ;; unknown type +(define-extern misty-battlecontroller type) +;;(define-extern *boatpaddle-sg* object) ;; unknown type +;;(define-extern boat-fuelcell-idle object) ;; unknown type +(define-extern mis-bone-bridge-event-handler function) +;;(define-extern boatpaddle-idle object) ;; unknown type +(define-extern windturbine type) +;;(define-extern breakaway-idle object) ;; unknown type +;;(define-extern windturbine-idle object) ;; unknown type +;;(define-extern *breakaway-right-sg* object) ;; unknown type +;;(define-extern boat-fuelcell-spawn object) ;; unknown type +;;(define-extern *mistycam-sg* object) ;; unknown type +;;(define-extern *mis-bone-bridge-sg* object) ;; unknown type +;;(define-extern *windturbine-sg* object) ;; unknown type +;;(define-extern task-complete object) ;; unknown type +;;(define-extern particle-select object) ;; unknown type +;;(define-extern animation-select object) ;; unknown type +;;(define-extern *rounddoor-sg* object) ;; unknown type +;;(define-extern silostep-camera object) ;; unknown type +(define-extern misty-camera-view function) +(define-extern silostep type) +;;(define-extern silostep-rise object) ;; unknown type +;;(define-extern silostep-idle object) ;; unknown type +;;(define-extern *silostep-sg* object) ;; unknown type +(define-extern rounddoor type) +;;(define-extern trigger-rise object) ;; unknown type +;;(define-extern keg-conveyor-idle object) ;; unknown type +(define-extern keg-conveyor type) +(define-extern keg-conveyor-spawn-keg function) +;;(define-extern keg-on-path object) ;; unknown type +;;(define-extern keg-conveyor-paddle-idle object) ;; unknown type +(define-extern keg-conveyor-paddle-init-by-other function) +;;(define-extern *keg-conveyor-paddle-sg* object) ;; unknown type +(define-extern keg-update-smush function) +(define-extern keg-post function) +;;(define-extern *keg-sg* object) ;; unknown type +;;(define-extern keg object) ;; unknown type +;;(define-extern keg-on-paddle object) ;; unknown type +(define-extern keg-conveyor-spawn-bouncing-keg function) +;;(define-extern keg-conveyor-paddle object) ;; unknown type +;;(define-extern keg-in-chute object) ;; unknown type +(define-extern keg-bounce-set-particle-rotation-callback function) +;;(define-extern keg-die object) ;; unknown type +;;(define-extern *keg-conveyor-keg-spawn-table* object) ;; unknown type +;;(define-extern keg-paddle-to-path object) ;; unknown type +;;(define-extern *keg-conveyor-sg* object) ;; unknown type +(define-extern keg-event-handler function) +(define-extern keg-init-by-other function) +;;(define-extern detach object) ;; unknown type +;;(define-extern ripple-for-small-mud object) ;; unknown type +(define-extern mud type) +;;(define-extern ripple-for-mud object) ;; unknown type +;;(define-extern water-anim-fade-dist object) ;; unknown type +(define-extern muse type) +;;(define-extern muse-idle object) ;; unknown type +;;(define-extern *muse-nav-enemy-info* object) ;; unknown type +(define-extern muse-check-dest-point function) +(define-extern analyze-point-on-path-segment function) +(define-extern muse-get-path-point function) +;;(define-extern point-on-path-segment-info object) ;; unknown type +;;(define-extern muse-caught object) ;; unknown type +;;(define-extern *muse-sg* object) ;; unknown type +;;(define-extern *bonelurker-sg* object) ;; unknown type +(define-extern bonelurker-push-post function) +(define-extern bonelurker type) +;;(define-extern *bonelurker-nav-enemy-info* object) ;; unknown type +(define-extern bonelurker-stunned-event-handler function) +(define-extern bonelurker-set-small-bounds-sphere function) +;;(define-extern bonelurker-stun object) ;; unknown type +(define-extern bonelurker-set-large-bounds-sphere function) +;;(define-extern quicksandlurker-missile-init-data object) ;; unknown type +;;(define-extern quicksandlurker-attack object) ;; unknown type +;;(define-extern quicksandlurker-missile-idle object) ;; unknown type +(define-extern spawn-quicksandlurker-missile function) +;;(define-extern quicksandlurker-yawn object) ;; unknown type +;;(define-extern quicksandlurker-hide object) ;; unknown type +(define-extern intersects-nav-mesh? function) +(define-extern quicksandlurker-check-hide-transition function) +;;(define-extern quicksandlurker-die object) ;; unknown type +(define-extern get-height-over-navmesh! function) +;;(define-extern *quicksandlurker-sg* object) ;; unknown type +;;(define-extern quicksandlurker-missile object) ;; unknown type +;;(define-extern quicksandlurker-victory object) ;; unknown type +(define-extern quicksandlurker-default-event-handler function) +;;(define-extern quicksandlurker-idle object) ;; unknown type +(define-extern quicksandlurker-spit function) +;;(define-extern quicksandlurker-missile-impact object) ;; unknown type +(define-extern orient-to-face-target function) +;;(define-extern quicksandlurker-popup object) ;; unknown type +(define-extern quicksandlurker-post function) +(define-extern quicksandlurker-missile-init-by-other function) +;;(define-extern quicksandlurker-wait object) ;; unknown type +;;(define-extern quicksandlurker-track object) ;; unknown type +(define-extern quicksandlurker type) +(define-extern inc-angle function) +;;(define-extern victory object) ;; unknown type +(define-extern teetertotter type) +;;(define-extern *teetertotter-sg* object) ;; unknown type +;;(define-extern teetertotter-launch object) ;; unknown type +;;(define-extern teetertotter-idle object) ;; unknown type +(define-extern target-on-end-of-teetertotter? function) +;;(define-extern teetertotter-bend object) ;; unknown type +(define-extern balloonlurker-bank type) +;;(define-extern *BALLOONLURKER-bank* object) ;; unknown type +;;(define-extern *balloonlurker-sg* object) ;; unknown type +(define-extern balloonlurker-get-path-point function) +;;(define-extern balloonlurker-pilot object) ;; unknown type +(define-extern balloonlurker-post function) +;;(define-extern balloonlurker-pilot-idle object) ;; unknown type +;;(define-extern *balloonlurker-pilot-sg* object) ;; unknown type +(define-extern balloonlurker-snap-to-path-point function) +(define-extern balloonlurker-player-impulse function) +;;(define-extern balloonlurker-mine-explode object) ;; unknown type +;;(define-extern *balloonlurker-constants* object) ;; unknown type +(define-extern balloonlurker-pilot-init-by-other function) +(define-extern balloonlurker-get-next-path-point function) +;;(define-extern balloonlurker-pilot-die object) ;; unknown type +;;(define-extern *balloonlurker-rudder-joint-home* object) ;; unknown type +;;(define-extern balloonlurker-die object) ;; unknown type +(define-extern balloonlurker-play-sounds function) +(define-extern balloonlurker-find-nearest-path-point function) +;;(define-extern balloonlurker-patrol object) ;; unknown type +(define-extern balloonlurker-event-handler function) +;;(define-extern *lurker-army* object) ;; unknown type +(define-extern army-info type) +(define-extern sequenceA type) +(define-extern sequenceC-can-trans-hook-2 function) +(define-extern sequenceC-trans-hook function) +(define-extern sequenceC type) +;;(define-extern *darkecocan-sg* object) ;; unknown type +;;(define-extern *evilsis-sg* object) ;; unknown type +(define-extern sequenceB type) +(define-extern evilsib-trans-hook-hover function) +(define-extern evilsib-trans-hook-wait function) +;;(define-extern *darkecocan-glow-sg* object) ;; unknown type +;;(define-extern *evilbro-sg* object) ;; unknown type +(define-extern sequenceC-can-trans-hook function) +;;(define-extern offset-army object) ;; unknown type +(define-extern firecanyon-part type) +;;(define-extern *assistant-firecanyon-sg* object) ;; unknown type +(define-extern assistant-firecanyon type) +(define-extern check-drop-level-sagehut2 function) +(define-extern villageb-part type) +;;(define-extern *ogreboss-village2-sg* object) ;; unknown type +;;(define-extern *med-res-rolling-sg* object) ;; unknown type +;;(define-extern *village2cam-sg* object) ;; unknown type +(define-extern pontoonten type) +(define-extern exit-chamber-dummy type) +;;(define-extern *fireboulder-sg* object) ;; unknown type +(define-extern ceilingflag type) +(define-extern ogreboss-village2-trans function) +;;(define-extern ceilingflag-idle object) ;; unknown type +(define-extern villageb-ogreboss type) +;;(define-extern *allpontoons-sg* object) ;; unknown type +(define-extern boulder3-trans-2 function) +;;(define-extern allpontoons-idle object) ;; unknown type +;;(define-extern *pontoonten-constants* object) ;; unknown type +(define-extern boulder3-trans function) +(define-extern allpontoons type) +(define-extern boulder4-trans-3 function) +;;(define-extern *exit-chamber-dummy-sg* object) ;; unknown type +;;(define-extern exit-chamber-dummy-idle object) ;; unknown type +;;(define-extern ogreboss-village2 object) ;; unknown type +;;(define-extern village2cam object) ;; unknown type +;;(define-extern *med-res-village2-sg* object) ;; unknown type +;;(define-extern *pontoonfive-sg* object) ;; unknown type +;;(define-extern pontoon-die object) ;; unknown type +(define-extern fireboulder type) +;;(define-extern fireboulder-be-clone object) ;; unknown type +(define-extern boulder2-trans-2 function) +;;(define-extern ripple-for-villageb-water object) ;; unknown type +;;(define-extern fireboulder-idle object) ;; unknown type +;;(define-extern ogreboss-village2-throw object) ;; unknown type +(define-extern boulder2-trans function) +(define-extern villageb-water type) +;;(define-extern pontoon object) ;; unknown type +;;(define-extern *ceilingflag-sg* object) ;; unknown type +(define-extern fireboulder-disable-blocking-collision function) +;;(define-extern *pontoonfive-constants* object) ;; unknown type +;;(define-extern allpontoons-be-clone object) ;; unknown type +(define-extern pontoonfive type) +(define-extern boulder1-trans function) +(define-extern boulder4-trans-2 function) +;;(define-extern *pontoonten-sg* object) ;; unknown type +;;(define-extern *med-res-rolling1-sg* object) ;; unknown type +(define-extern fireboulder-hover-stuff function) +(define-extern boulder4-trans function) +;;(define-extern ogreboss-village2-idle object) ;; unknown type +;;(define-extern exit-chamber-dummy-wait-to-appear object) ;; unknown type +;;(define-extern pontoon-hidden object) ;; unknown type +;;(define-extern fireboulder-hover object) ;; unknown type +;;(define-extern *gambler-sg* object) ;; unknown type +(define-extern gambler type) +;;(define-extern *warrior-sg* object) ;; unknown type +(define-extern warrior type) +;;(define-extern *geologist-sg* object) ;; unknown type +(define-extern geologist type) +;;(define-extern swamp-rope-idle-arm object) ;; unknown type +(define-extern swamp-rope-init-by-other function) +;;(define-extern *precursor-arm-sg* object) ;; unknown type +(define-extern tetherrock-get-info function) +;;(define-extern swamp-blimp-bye-bye object) ;; unknown type +(define-extern swamp-rope-update-bounding-spheres function) +(define-extern swamp-blimp-setup function) +(define-extern blimp-trans function) +;;(define-extern *swamp-blimp-sg* object) ;; unknown type +;;(define-extern *swamp-tetherrock-explode-sg* object) ;; unknown type +(define-extern swamp-blimp type) +;;(define-extern swamp-rope-idle-rock object) ;; unknown type +;;(define-extern swamp-tetherrock-hide object) ;; unknown type +(define-extern precursor-arm-slip function) +;;(define-extern swamp-blimp-rand-vector object) ;; unknown type +(define-extern swamp-tetherrock type) +;;(define-extern *swamp-tetherrock-sg* object) ;; unknown type +;;(define-extern tetherrock-info object) ;; unknown type +;;(define-extern precursor-arm-idle object) ;; unknown type +;;(define-extern swamp-rope-oscillator object) ;; unknown type +;;(define-extern swamp-blimp-oscillator object) ;; unknown type +(define-extern swamp-rope-trans function) +;;(define-extern precursor-arm-die object) ;; unknown type +(define-extern swamp-rope-break-code function) +;;(define-extern *SWAMP_BLIMP-bank* object) ;; unknown type +(define-extern swamp-blimp-bank type) +;;(define-extern swamp-tetherrock-die object) ;; unknown type +(define-extern bustarock function) +;;(define-extern swamp-rope-break object) ;; unknown type +;;(define-extern swamp-tetherrock-idle object) ;; unknown type +;;(define-extern swamp-blimp-idle object) ;; unknown type +(define-extern precursor-arm type) +;;(define-extern swamp-tetherrock-break object) ;; unknown type +;;(define-extern precursor-arm-sink object) ;; unknown type +(define-extern swamp-rope-post function) +;;(define-extern swamp-rope-rand-float object) ;; unknown type +;;(define-extern swamp-rope object) ;; unknown type +;;(define-extern *swamp-rope-sg* object) ;; unknown type +;;(define-extern tetherrock-break-evt object) ;; unknown type +;;(define-extern arm-sink-evt object) ;; unknown type +;;(define-extern *sage-bluehut-sg* object) ;; unknown type +(define-extern sage-bluehut type) +(define-extern assistant-bluehut type) +(define-extern flutflut-bluehut type) +;;(define-extern *flutflut-bluehut-sg* object) ;; unknown type +(define-extern assistant-levitator-blue-beam function) +;;(define-extern just-particles object) ;; unknown type +;;(define-extern *assistant-village2-sg* object) ;; unknown type +(define-extern assistant-levitator-blue-glow function) +(define-extern check-drop-level-assistant-bluehut function) +;;(define-extern *jaws-sg* object) ;; unknown type +;;(define-extern *sunken-elevator-sg* object) ;; unknown type +(define-extern sunken-elevator type) +(define-extern swampgate type) +;;(define-extern *swamp-spike-sg* object) ;; unknown type +;;(define-extern *balance-plat-sg* object) ;; unknown type +(define-extern tar-plat type) +(define-extern swampcam type) +(define-extern swamp-barrel type) +;;(define-extern *tar-plat-sg* object) ;; unknown type +(define-extern balance-plat type) +(define-extern swamp-spike-set-particle-rotation-callback function) +;;(define-extern *tar-plat-constants* object) ;; unknown type +(define-extern swamp-rock-init-by-other function) +;;(define-extern swamp-spike-gate-down object) ;; unknown type +(define-extern swamp-spike-default-event-handler function) +;;(define-extern *swampcam-sg* object) ;; unknown type +(define-extern swamp-spike-post function) +;;(define-extern balance-plat-idle object) ;; unknown type +;;(define-extern *swamp-rock-sg* object) ;; unknown type +;;(define-extern swamp-spike-gate-up object) ;; unknown type +(define-extern swamp-battlecontroller type) +(define-extern swamp-spike type) +;;(define-extern swamp-spike-idle object) ;; unknown type +;;(define-extern swamp-rock-idle object) ;; unknown type +;;(define-extern swamp-rock-break object) ;; unknown type +(define-extern swamp-rock type) +;;(define-extern grow object) ;; unknown type +;;(define-extern scale-factor object) ;; unknown type +;;(define-extern swamp-bat-slave object) ;; unknown type +;;(define-extern *swamp-bat-slave-sg* object) ;; unknown type +;;(define-extern swamp-bat-slave-swoop object) ;; unknown type +(define-extern swamp-bat-launch-slave function) +;;(define-extern swamp-bat-slave-return object) ;; unknown type +;;(define-extern swamp-bat-idle-path object) ;; unknown type +;;(define-extern swamp-bat-idle object) ;; unknown type +(define-extern swamp-bat-debug function) +;;(define-extern swamp-bat-slave-strafe object) ;; unknown type +(define-extern swamp-bat-make-path-select-plane function) +(define-extern swamp-bat-slave-post function) +(define-extern swamp-bat-check-slave-paths-match? function) +;;(define-extern swamp-bat-slave-launch object) ;; unknown type +;;(define-extern swamp-bat-slave-idle object) ;; unknown type +;;(define-extern swamp-bat-slave-die object) ;; unknown type +(define-extern swamp-bat-slave-get-new-path function) +(define-extern swamp-bat type) +(define-extern swamp-bat-setup-new-path function) +;;(define-extern swamp-bat-launch-slaves object) ;; unknown type +(define-extern swamp-bat-update-path function) +(define-extern swamp-bat-slave-init-by-other function) +(define-extern swamp-bat-slave-event-handler function) +(define-extern swamp-bat-slave-path-post function) +;;(define-extern swamp-rat-spawn object) ;; unknown type +(define-extern swamp-rat-update-wiggle-target function) +(define-extern swamp-rat-update-wiggle-params function) +(define-extern swamp-rat-default-event-handler function) +;;(define-extern *swamp-rat-nav-enemy-info* object) ;; unknown type +(define-extern swamp-rat type) +;;(define-extern *swamp-rat-sg* object) ;; unknown type +(define-extern swamp-rat-init-by-other function) +;;(define-extern pointer object) ;; unknown type +;;(define-extern *swamp-rat-nest-dummy-b-sg* object) ;; unknown type +(define-extern swamp-rat-nest-dummy-draw-spawn-joints function) +(define-extern swamp-rat-nest-pick-spawn-joint function) +;;(define-extern swamp-rat-nest-gestate object) ;; unknown type +(define-extern swamp-rat-nest-default-event-handler function) +(define-extern swamp-rat-nest-spawn-rat function) +;;(define-extern swamp-rat-nest-dummy object) ;; unknown type +;;(define-extern swamp-rat-nest-active object) ;; unknown type +;;(define-extern swamp-rat-nest-dummy-shake object) ;; unknown type +;;(define-extern swamp-rat-nest-dummy-die object) ;; unknown type +(define-extern swamp-rat-nest-check-dummy function) +;;(define-extern swamp-rat-nest-dummy-c object) ;; unknown type +(define-extern swamp-rat-nest-dummy-init-by-other function) +;;(define-extern swamp-rat-nest-dummy-idle object) ;; unknown type +;;(define-extern swamp-rat-nest-dummy-a object) ;; unknown type +;;(define-extern *swamp-rat-nest-dummy-a-sg* object) ;; unknown type +(define-extern swamp-rat-nest-dummy-event-handler function) +;;(define-extern swamp-rat-nest-victory object) ;; unknown type +(define-extern swamp-rat-nest type) +(define-extern swamp-rat-nest-dummy-take-damage function) +;;(define-extern swamp-rat-nest-dummy-hit object) ;; unknown type +;;(define-extern *swamp-rat-nest-dummy-c-sg* object) ;; unknown type +;;(define-extern swamp-rat-nest-idle object) ;; unknown type +;;(define-extern swamp-rat-nest-dummy-b object) ;; unknown type +;;(define-extern swamp-rat-nest-die object) ;; unknown type +;;(define-extern shake object) ;; unknown type +(define-extern kermit-post function) +(define-extern kermit-player-target-pos function) +(define-extern kermit-disable-tongue function) +;;(define-extern *kermit-nav-enemy-info* object) ;; unknown type +(define-extern kermit-short-hop function) +;;(define-extern kermit-patrol object) ;; unknown type +;;(define-extern kermit-idle object) ;; unknown type +(define-extern kermit-pulse-init-by-other function) +(define-extern spawn-kermit-pulse function) +(define-extern kermit-hop function) +;;(define-extern kermit-notice object) ;; unknown type +;;(define-extern kermit-pulse-impact object) ;; unknown type +(define-extern kermit-enable-tongue function) +(define-extern kermit-check-tongue-is-clear? function) +(define-extern kermit-check-to-hit-player? function) +;;(define-extern kermit-retract-tongue object) ;; unknown type +(define-extern build-matrix-from-up-and-forward-axes! function) +;;(define-extern kermit-attack object) ;; unknown type +(define-extern kermit-tongue-pos function) +;;(define-extern kermit-tongue-stuck object) ;; unknown type +(define-extern kermit-get-new-patrol-point function) +;;(define-extern joint-mod-tracker object) ;; unknown type +(define-extern kermit-get-tongue-target-callback function) +(define-extern kermit type) +;;(define-extern *kermit-sg* object) ;; unknown type +;;(define-extern kermit-give-up object) ;; unknown type +(define-extern kermit-long-hop function) +(define-extern kermit-set-nav-mesh-target function) +(define-extern kermit-get-head-dir-xz function) +;;(define-extern kermit-chase object) ;; unknown type +;;(define-extern kermit-pulse-idle object) ;; unknown type +(define-extern kermit-set-rotate-dir-to-player function) +(define-extern joint-mod-tracker-callback function) +;;(define-extern kermit-chase-new-position object) ;; unknown type +;;(define-extern kermit-pulse object) ;; unknown type +(define-extern kermit-get-head-dir function) +(define-extern kermit-simple-post function) +(define-extern kermit-set-rotate-dir-to-nav-target function) +(define-extern swamp-part type) +;;(define-extern billy-rat-salivate object) ;; unknown type +;;(define-extern *billy-sg* object) ;; unknown type +;;(define-extern billy-playing object) ;; unknown type +;;(define-extern billy-snack-eat object) ;; unknown type +;;(define-extern billy-rat object) ;; unknown type +;;(define-extern billy-snack object) ;; unknown type +;;(define-extern billy-rat-eat object) ;; unknown type +;;(define-extern billy-done object) ;; unknown type +(define-extern billy-kill-all-but-farthy function) +(define-extern rat-about-to-eat? function) +(define-extern billy-snack-init-by-other function) +;;(define-extern billy-snack-idle object) ;; unknown type +(define-extern billy-rat-init-by-other function) +(define-extern billy-game-update-wave function) +(define-extern billy-game-update function) +;;(define-extern *billy-sidekick-sg* object) ;; unknown type +;;(define-extern *farthy-snack-sg* object) ;; unknown type +;;(define-extern billy-rat-die object) ;; unknown type +;;(define-extern eat object) ;; unknown type +;;(define-extern billy-rat-needs-destination object) ;; unknown type +;;(define-extern cavecrystal-light object) ;; unknown type +;;(define-extern *cavecrystal-engine* object) ;; unknown type +(define-extern cavecrystal-light-control type) +(define-extern cavecrystal-light-control-default-callback function) +(define-extern cavecrystal-light-control-caveelevator-callback function) +;;(define-extern *cavespatulatwo-sg* object) ;; unknown type +;;(define-extern maincavecam object) ;; unknown type +;;(define-extern *maincavecam-sg* object) ;; unknown type +;;(define-extern caveelevator-cycle-active object) ;; unknown type +;;(define-extern caveelevator-one-way-travel-to-end object) ;; unknown type +(define-extern cavecrusher type) +(define-extern caveflamepots type) +;;(define-extern *cavetrapdoor-sg* object) ;; unknown type +(define-extern caveelevator-joint-callback function) +;;(define-extern *cavecrusher-sg* object) ;; unknown type +;;(define-extern caveelevator-one-way-idle-end object) ;; unknown type +;;(define-extern ripple-for-cave-water object) ;; unknown type +(define-extern cavespatulatwo type) +;;(define-extern caveelevator-one-way-idle-start object) ;; unknown type +;;(define-extern caveflamepots-active object) ;; unknown type +;;(define-extern cavespatula-idle object) ;; unknown type +;;(define-extern *caveelevator-sg* object) ;; unknown type +;;(define-extern *cavespatula-darkcave-sg* object) ;; unknown type +;;(define-extern *cavespatula-sg* object) ;; unknown type +;;(define-extern caveelevator-one-way-travel-to-start object) ;; unknown type +;;(define-extern cavecrusher-idle object) ;; unknown type +;;(define-extern cavespatulatwo-idle object) ;; unknown type +;;(define-extern darkcave-part object) ;; unknown type +(define-extern maincave-part type) +(define-extern check-drop-level-maincave-drip function) +;;(define-extern spiderwebs-bounce object) ;; unknown type +(define-extern spiderwebs type) +;;(define-extern spiderwebs-idle object) ;; unknown type +(define-extern spiderwebs-default-event-handler function) +;;(define-extern *spiderwebs-sg* object) ;; unknown type +;;(define-extern *spider-jump-mods* object) ;; unknown type +;;(define-extern *dark-crystal-flash-delays* object) ;; unknown type +;;(define-extern dark-crystal-idle object) ;; unknown type +;;(define-extern *dark-crystal-explode-sg* object) ;; unknown type +;;(define-extern *dark-crystal-exploder-params* object) ;; unknown type +;;(define-extern dark-crystal-activate object) ;; unknown type +;;(define-extern dark-crystal-explode object) ;; unknown type +;;(define-extern *dark-crystal-sg* object) ;; unknown type +;;(define-extern dark-crystal-spawn-fuel-cell object) ;; unknown type +;;(define-extern extra-radius object) ;; unknown type +;;(define-extern *baby-spider-nav-enemy-info-for-cave-trap* object) ;; unknown type +;;(define-extern baby-spider-die-fast object) ;; unknown type +;;(define-extern *baby-spider-nav-enemy-info* object) ;; unknown type +;;(define-extern *baby-spider-sg* object) ;; unknown type +;;(define-extern baby-spider-resume object) ;; unknown type +;;(define-extern baby-spider-spawn-params object) ;; unknown type +;;(define-extern baby-spider-hatching object) ;; unknown type +(define-extern baby-spider-init-by-other function) +(define-extern baby-spider-default-event-handler function) +(define-extern cave-trap type) +;;(define-extern mother-spider-thread object) ;; unknown type +;;(define-extern mother-spider-history-array object) ;; unknown type +;;(define-extern mother-spider-leg object) ;; unknown type +;;(define-extern mother-spider-leg-info object) ;; unknown type +;;(define-extern mother-spider-history object) ;; unknown type +;;(define-extern mother-spider-egg-falling object) ;; unknown type +;;(define-extern mother-spider-egg-die-exit object) ;; unknown type +;;(define-extern mother-spider-egg-hatch object) ;; unknown type +;;(define-extern mother-spider-egg object) ;; unknown type +;;(define-extern mother-spider-egg-die-while-falling object) ;; unknown type +(define-extern mother-spider-egg-init-by-other function) +;;(define-extern mother-spider-egg-on-ground object) ;; unknown type +;;(define-extern *mother-spider-egg-unbroken-sg* object) ;; unknown type +;;(define-extern mother-spider-egg-die object) ;; unknown type +;;(define-extern *mother-spider-egg-broken-sg* object) ;; unknown type +(define-extern mother-spider-proj-update-velocity function) +;;(define-extern mother-spider-proj object) ;; unknown type +;;(define-extern mother-spider-hit-while-tracking object) ;; unknown type +;;(define-extern wait-for-children object) ;; unknown type +;;(define-extern mother-spider-spit object) ;; unknown type +(define-extern mother-spider-default-event-handler function) +;;(define-extern mother-spider-stop-traveling object) ;; unknown type +;;(define-extern mother-spider-tracking object) ;; unknown type +;;(define-extern mother-spider-die-wait-for-children object) ;; unknown type +;;(define-extern mother-spider-hit-while-birthing object) ;; unknown type +;;(define-extern mother-spider-birth-baby object) ;; unknown type +;;(define-extern mother-spider-die-from-uppercut object) ;; unknown type +;;(define-extern mother-spider-idle object) ;; unknown type +;;(define-extern mother-spider-traveling object) ;; unknown type +(define-extern mother-spider-death-event-handler function) +;;(define-extern mother-spider-leg-flying object) ;; unknown type +(define-extern mother-spider-leg-init-by-other function) +(define-extern mother-spider-full-joint-callback function) +;;(define-extern *mother-spider-sg* object) ;; unknown type +;;(define-extern *mother-spider-leg-sg* object) ;; unknown type +;;(define-extern mother-spider-die object) ;; unknown type +;;(define-extern *mother-spider-threads* object) ;; unknown type +;;(define-extern mother-spider-birthing object) ;; unknown type +;;(define-extern *mother-spider-leg-infos* object) ;; unknown type +;;(define-extern gnawer-wait-to-run object) ;; unknown type +;;(define-extern *gnawer-sg* object) ;; unknown type +;;(define-extern *gnawer-segment-infos* object) ;; unknown type +(define-extern gnawer type) +;;(define-extern gnawer-falling-segment object) ;; unknown type +(define-extern gnawer-falling-segment-init-by-other function) +;;(define-extern gnawer-retreat-into-post object) ;; unknown type +;;(define-extern gnawer-route object) ;; unknown type +;;(define-extern gnawer-segment object) ;; unknown type +;;(define-extern gnawer-die object) ;; unknown type +;;(define-extern *gnawer-segment-sg* object) ;; unknown type +;;(define-extern gnawer-chewing-on-post object) ;; unknown type +;;(define-extern gnawer-run object) ;; unknown type +;;(define-extern gnawer-give-fuel-cell object) ;; unknown type +;;(define-extern gnawer-put-items-at-dest object) ;; unknown type +(define-extern gnawer-joint-callback function) +;;(define-extern gnawer-dying-give-pickups object) ;; unknown type +;;(define-extern gnawer-segment-info object) ;; unknown type +;;(define-extern driller-lurker-idle-drilling object) ;; unknown type +;;(define-extern driller-lurker-patrol object) ;; unknown type +;;(define-extern *driller-lurker-sg* object) ;; unknown type +;;(define-extern driller-lurker-jammed-standing object) ;; unknown type +(define-extern driller-lurker-default-event-handler function) +;;(define-extern driller-lurker-debug-play-anims object) ;; unknown type +;;(define-extern driller-lurker-die object) ;; unknown type +;;(define-extern *driller-lurker-shadow-control* object) ;; unknown type +;;(define-extern driller-lurker-patrol-pause object) ;; unknown type +(define-extern driller-lurker type) +;;(define-extern driller-lurker-attack object) ;; unknown type +;;(define-extern driller-lurker-chase object) ;; unknown type +(define-extern sunken-part type) +;;(define-extern target-tube object) ;; unknown type +;;(define-extern *TUBE-bank* object) ;; unknown type +;;(define-extern *tube-hit-mods* object) ;; unknown type +;;(define-extern tube-info object) ;; unknown type +;;(define-extern *tube-surface* object) ;; unknown type +(define-extern tube-thrust function) +;;(define-extern target-tube-hit object) ;; unknown type +(define-extern slide-control type) +(define-extern target-tube-turn-anim function) +;;(define-extern *tube-jump-mods* object) ;; unknown type +;;(define-extern target-tube-death object) ;; unknown type +;;(define-extern target-tube-jump object) ;; unknown type +;;(define-extern *tube-mods* object) ;; unknown type +(define-extern tube-sounds function) +(define-extern tube-bank type) +(define-extern distance-from-tangent function) +(define-extern target-tube-post function) +(define-extern find-target-point function) +;;(define-extern slide-control-watch object) ;; unknown type +;;(define-extern slide-control-ride object) ;; unknown type +;;(define-extern *side-to-side-plat-sg* object) ;; unknown type +;;(define-extern sunkencam object) ;; unknown type +;;(define-extern water-vol-deadly object) ;; unknown type +;;(define-extern *seaweed-sg* object) ;; unknown type +;;(define-extern seaweed-idle object) ;; unknown type +;;(define-extern *sunkencam-sg* object) ;; unknown type +(define-extern seaweed type) +(define-extern side-to-side-plat type) +;;(define-extern *seaweed* object) ;; unknown type +;;(define-extern shover-idle object) ;; unknown type +(define-extern shover type) +;;(define-extern *shover-sg* object) ;; unknown type +;;(define-extern *shover* object) ;; unknown type +;;(define-extern collision-mesh-id object) ;; unknown type +;;(define-extern square-platform-lowering object) ;; unknown type +(define-extern square-platform-master type) +(define-extern square-platform type) +;;(define-extern *square-platform-sg* object) ;; unknown type +(define-extern square-platform-button type) +;;(define-extern square-platform-lowered object) ;; unknown type +;;(define-extern square-platform-master-idle object) ;; unknown type +;;(define-extern square-platform-master-activate object) ;; unknown type +;;(define-extern square-platform-raised object) ;; unknown type +;;(define-extern square-platform-rising object) ;; unknown type +;;(define-extern sun-iris-door-closing object) ;; unknown type +(define-extern sun-iris-door type) +;;(define-extern sun-iris-door-opening object) ;; unknown type +;;(define-extern sun-iris-door-closed object) ;; unknown type +;;(define-extern sun-iris-door-open object) ;; unknown type +;;(define-extern *sun-iris-door-sg* object) ;; unknown type +(define-extern sun-iris-door-init-by-other function) +;;(define-extern proximity object) ;; unknown type +;;(define-extern orbit-plat-bottom-idle object) ;; unknown type +;;(define-extern orbit-plat-idle object) ;; unknown type +;;(define-extern orbit-plat-reset object) ;; unknown type +;;(define-extern orbit-plat-riding object) ;; unknown type +(define-extern orbit-plat type) +(define-extern orbit-plat-bottom-init-by-other function) +;;(define-extern *orbit-plat-bottom-sg* object) ;; unknown type +;;(define-extern orbit-plat-wait-for-other object) ;; unknown type +;;(define-extern orbit-plat-still object) ;; unknown type +;;(define-extern orbit-plat-rotating object) ;; unknown type +;;(define-extern *orbit-plat-sg* object) ;; unknown type +(define-extern get-nav-point! function) +(define-extern get-rotate-point! function) +;;(define-extern orbit-plat-bottom object) ;; unknown type +;;(define-extern query-reset object) ;; unknown type +;;(define-extern wedge-plat-idle object) ;; unknown type +(define-extern wedge-plat type) +;;(define-extern wedge-plat-tip object) ;; unknown type +;;(define-extern wedge-plat-outer-tip object) ;; unknown type +(define-extern wedge-plat-master type) +;;(define-extern wedge-plat-outer-idle object) ;; unknown type +(define-extern wedge-plat-outer type) +;;(define-extern wedge-plat-master-idle object) ;; unknown type +;;(define-extern *wedge-plat-outer-sg* object) ;; unknown type +;;(define-extern *wedge-plat-sg* object) ;; unknown type +;;(define-extern wall-plat-sync-idle object) ;; unknown type +;;(define-extern wall-plat-retracting object) ;; unknown type +;;(define-extern *wall-plat-sg* object) ;; unknown type +;;(define-extern wall-plat-extending object) ;; unknown type +(define-extern wall-plat type) +;;(define-extern wall-plat-extended object) ;; unknown type +;;(define-extern wall-plat-retracted object) ;; unknown type +;;(define-extern tunemeters object) ;; unknown type +;;(define-extern qbert-plat-master-do-door object) ;; unknown type +;;(define-extern qbert-plat-master-wait-for-door object) ;; unknown type +(define-extern qbert-plat-event-handler function) +;;(define-extern qbert-plat-on object) ;; unknown type +;;(define-extern *qbert-plat-on-sg* object) ;; unknown type +;;(define-extern *qbert-plat-constants* object) ;; unknown type +;;(define-extern qbert-plat-master-idle object) ;; unknown type +;;(define-extern *qbert-plat-sg* object) ;; unknown type +(define-extern qbert-plat-on-init-by-other function) +;;(define-extern qbert-plat-on-mimic object) ;; unknown type +(define-extern qbert-plat-master type) +(define-extern qbert-plat type) +;;(define-extern qbert-plat-on-die object) ;; unknown type +;;(define-extern qbert-plat-wait-for-master object) ;; unknown type +(define-extern steam-cap type) +;;(define-extern steam-cap-idle object) ;; unknown type +;;(define-extern *steam-cap-sg* object) ;; unknown type +;;(define-extern steam-cap-control-pt object) ;; unknown type +;;(define-extern exit-chamber-charger-puzzle object) ;; unknown type +;;(define-extern blue-eco-charger-close object) ;; unknown type +;;(define-extern *blue-eco-charger-sg* object) ;; unknown type +;;(define-extern blue-eco-charger-orb-idle object) ;; unknown type +;;(define-extern blue-eco-charger-open object) ;; unknown type +;;(define-extern exit-chamber-items object) ;; unknown type +(define-extern blue-eco-charger type) +;;(define-extern blue-eco-charger-stuck-open object) ;; unknown type +;;(define-extern exit-chamber-charger-puzzle-beaten object) ;; unknown type +;;(define-extern exit-chamber-lower object) ;; unknown type +;;(define-extern blue-eco-charger-orb-active object) ;; unknown type +(define-extern blue-eco-charger-orb-init-by-other function) +;;(define-extern blue-eco-charger-idle object) ;; unknown type +;;(define-extern *exit-chamber-sg* object) ;; unknown type +;;(define-extern exit-chamber-button object) ;; unknown type +(define-extern exit-chamber-button-init-by-other function) +(define-extern exit-chamber type) +;;(define-extern *blue-eco-charger-orb-sg* object) ;; unknown type +;;(define-extern exit-chamber-idle-in-sunken object) ;; unknown type +;;(define-extern exit-chamber-rise object) ;; unknown type +;;(define-extern exit-chamber-idle-in-village object) ;; unknown type +;;(define-extern blue-eco-charger-orb object) ;; unknown type +;;(define-extern floating-launcher-idle object) ;; unknown type +;;(define-extern floating-launcher-ready object) ;; unknown type +;;(define-extern floating-launcher-lowering object) ;; unknown type +;;(define-extern *floating-launcher-sg* object) ;; unknown type +(define-extern floating-launcher type) +;;(define-extern trigger-height object) ;; unknown type +;;(define-extern ripple-for-sunken-water object) ;; unknown type +(define-extern sunken-water type) +(define-extern whirlpool type) +;;(define-extern whirlpool-idle object) ;; unknown type +;;(define-extern *whirlpool-sg* object) ;; unknown type +;;(define-extern sunken-pipegame-prize object) ;; unknown type +;;(define-extern sunken-pipegame-idle object) ;; unknown type +;;(define-extern sunken-pipegame-start-up object) ;; unknown type +;;(define-extern sunken-pipegame-button object) ;; unknown type +(define-extern sunken-pipegame type) +;;(define-extern sunken-pipegame-beat-challenge object) ;; unknown type +;;(define-extern sunken-pipegame-begin-play object) ;; unknown type +;;(define-extern sunken-pipegame-end-play object) ;; unknown type +(define-extern sunken-pipegame-button-init-by-other function) +(define-extern bully-broken-cage-init-by-other function) +;;(define-extern bully-notice object) ;; unknown type +;;(define-extern bully-die object) ;; unknown type +;;(define-extern bully-broken-cage-explode object) ;; unknown type +;;(define-extern bully-stop-spinning object) ;; unknown type +(define-extern bully-default-event-handler function) +;;(define-extern bully-start-spinning object) ;; unknown type +;;(define-extern *bully-broken-cage-sg* object) ;; unknown type +(define-extern bully type) +;;(define-extern *bully-shadow-control* object) ;; unknown type +;;(define-extern bully-idle object) ;; unknown type +;;(define-extern *bully-sg* object) ;; unknown type +(define-extern bully-post function) +;;(define-extern bully-broken-cage object) ;; unknown type +;;(define-extern double-lurker-top-on-shoulders-die object) ;; unknown type +;;(define-extern double-lurker-waiting-to-die object) ;; unknown type +;;(define-extern double-lurker-knocked-back object) ;; unknown type +;;(define-extern double-lurker-top object) ;; unknown type +;;(define-extern *double-lurker-top-sg* object) ;; unknown type +(define-extern double-lurker-top-init-by-other function) +;;(define-extern *double-lurker-sg* object) ;; unknown type +;;(define-extern double-lurker-buddy-was-hit object) ;; unknown type +;;(define-extern *double-lurker-nav-enemy-info* object) ;; unknown type +;;(define-extern double-lurker-resume object) ;; unknown type +;;(define-extern double-lurker-show-anims object) ;; unknown type +;;(define-extern double-lurker-both-knocked-back object) ;; unknown type +;;(define-extern double-lurker-top-resume object) ;; unknown type +(define-extern double-lurker type) +;;(define-extern *double-lurker-top-nav-enemy-info* object) ;; unknown type +;;(define-extern double-lurker-top-on-shoulders object) ;; unknown type +;;(define-extern *double-lurker-when-both-nav-enemy-info* object) ;; unknown type +;;(define-extern double-lurker-top-knocked-down object) ;; unknown type +(define-extern double-lurker-default-event-handler function) +;;(define-extern double-lurker-break-apart object) ;; unknown type +;;(define-extern helix-button-startup object) ;; unknown type +;;(define-extern *helix-slide-door-sg* object) ;; unknown type +;;(define-extern helix-button-quick-activate object) ;; unknown type +(define-extern helix-water type) +;;(define-extern helix-slide-door-idle-closed object) ;; unknown type +;;(define-extern helix-button-idle-down object) ;; unknown type +;;(define-extern helix-water-idle object) ;; unknown type +(define-extern helix-slide-door type) +;;(define-extern helix-button-idle-up object) ;; unknown type +(define-extern helix-button type) +;;(define-extern helix-slide-door-close object) ;; unknown type +;;(define-extern helix-dark-eco object) ;; unknown type +;;(define-extern helix-water-activated object) ;; unknown type +;;(define-extern *helix-button-sg* object) ;; unknown type +;;(define-extern helix-slide-door-idle-open object) ;; unknown type +;;(define-extern helix-button-activate object) ;; unknown type +;;(define-extern *helix-button* object) ;; unknown type +;;(define-extern *helix-slide-door* object) ;; unknown type +;;(define-extern *helix-water* object) ;; unknown type +(define-extern puffer-default-event-handler function) +;;(define-extern puffer-die object) ;; unknown type +(define-extern puffer-post function) +;;(define-extern *puffer-mean-sg* object) ;; unknown type +;;(define-extern pick-patrol-point-away-from-buddy-work object) ;; unknown type +;;(define-extern *puffer-sg* object) ;; unknown type +;;(define-extern puffer-attack object) ;; unknown type +;;(define-extern puffer-patrol object) ;; unknown type +;;(define-extern puffer-idle object) ;; unknown type +(define-extern puffer type) +(define-extern sunkenfisha type) +(define-extern sunkenfisha-init-by-other function) +;;(define-extern *sunkenfisha-red-yellow-sg* object) ;; unknown type +;;(define-extern sunkenfisha-idle object) ;; unknown type +;;(define-extern *sunkenfisha-yellow-eye-sg* object) ;; unknown type +;;(define-extern *sunkenfisha-yellow-blue-sg* object) ;; unknown type +;;(define-extern path-max-offset object) ;; unknown type +;;(define-extern path-trans-offset object) ;; unknown type +(define-extern gorge-in-front function) +(define-extern happy-plant type) +;;(define-extern rolling-start object) ;; unknown type +(define-extern gorge-start-draw-time function) +(define-extern pusher type) +(define-extern rolling-start-init-by-other function) +(define-extern race-time-copy! function) +;;(define-extern dark-plant-idle object) ;; unknown type +(define-extern dark-plant-has-bad-neighbor function) +(define-extern dark-plants-all-done function) +;;(define-extern gorge-start-race-finished object) ;; unknown type +;;(define-extern *dark-plant-sg* object) ;; unknown type +(define-extern gorge-behind function) +;;(define-extern *rollingcam-sg* object) ;; unknown type +;;(define-extern gorge-abort-idle object) ;; unknown type +(define-extern race-time-save function) +(define-extern gorge-finish-init-by-other function) +(define-extern gorge-pusher type) +;;(define-extern *happy-plant-sg* object) ;; unknown type +;;(define-extern dark-plant-death object) ;; unknown type +(define-extern race-time-read function) +(define-extern gorge-start-launch-start-banner function) +;;(define-extern gorge-start-idle object) ;; unknown type +;;(define-extern happy-plant-opening object) ;; unknown type +;;(define-extern gorge-pusher-idle object) ;; unknown type +;;(define-extern race-time object) ;; unknown type +(define-extern rollingcam type) +(define-extern race-time->seconds function) +(define-extern dark-plant-trans function) +;;(define-extern ripple-for-rolling-water object) ;; unknown type +;;(define-extern gorge-finish object) ;; unknown type +(define-extern gorge-trans function) +;;(define-extern rolling-start-whole object) ;; unknown type +(define-extern dark-plant-check-target function) +;;(define-extern rolling-start-break object) ;; unknown type +;;(define-extern happy-plant-opened object) ;; unknown type +;;(define-extern gorge-start-racing object) ;; unknown type +;;(define-extern pusher-base object) ;; unknown type +;;(define-extern *rolling-start-whole-sg* object) ;; unknown type +;;(define-extern happy-plant-init object) ;; unknown type +(define-extern race-time->string function) +(define-extern gorge-abort-init-by-other function) +;;(define-extern gorge-finish-idle object) ;; unknown type +;;(define-extern pusher-idle object) ;; unknown type +;;(define-extern gorge-start-race-aborted object) ;; unknown type +;;(define-extern gorge-abort object) ;; unknown type +;;(define-extern *pusher-sg* object) ;; unknown type +;;(define-extern rolling-part object) ;; unknown type +(define-extern rolling-water type) +;;(define-extern dark-plant-startup object) ;; unknown type +;;(define-extern gorge-start-ready object) ;; unknown type +(define-extern gorge-init function) +(define-extern seconds->race-time function) +(define-extern pusher-base-init function) +;;(define-extern gorge object) ;; unknown type +(define-extern dark-plant-randomize function) +;;(define-extern dark-plant-sprout object) ;; unknown type +(define-extern race-time-less-than function) +(define-extern dark-plant type) +(define-extern gorge-start type) +;;(define-extern dark-plant-gone object) ;; unknown type +;;(define-extern *rolling-start-broken-sg* object) ;; unknown type +;;(define-extern finished object) ;; unknown type +;;(define-extern min-frame object) ;; unknown type +;;(define-extern break object) ;; unknown type +;;(define-extern unbreak object) ;; unknown type +;;(define-extern aborted object) ;; unknown type +;;(define-extern break-and-die object) ;; unknown type +;;(define-extern max-frame object) ;; unknown type +(define-extern lightning-mole type) +;;(define-extern lightning-mole-dive object) ;; unknown type +;;(define-extern *lightning-mole-nav-enemy-info* object) ;; unknown type +(define-extern find-adjacent-bounds-one function) +;;(define-extern fleeing-nav-enemy-debug object) ;; unknown type +;;(define-extern *lightning-mole-hole* object) ;; unknown type +;;(define-extern lightning-mole-gone object) ;; unknown type +(define-extern lightning-mole-hole-post function) +;;(define-extern fleeing-nav-enemy-info object) ;; unknown type +(define-extern lightning-mole-task-complete? function) +(define-extern check-drop-level-rolling-dirt function) +(define-extern find-adjacent-bounds function) +;;(define-extern peeper-up object) ;; unknown type +;;(define-extern lightning-mole-debug-run object) ;; unknown type +(define-extern fleeing-nav-enemy-adjust-nav-info function) +(define-extern fleeing-nav-enemy-adjust-travel function) +(define-extern fleeing-nav-enemy-chase-post function) +;;(define-extern lightning-mole-yelp object) ;; unknown type +(define-extern lightning-mole-run-code function) +;;(define-extern lightning-mole-head-for-hole object) ;; unknown type +;;(define-extern *lightning-mole-sg* object) ;; unknown type +;;(define-extern peeper-hide object) ;; unknown type +;;(define-extern peeper-down object) ;; unknown type +(define-extern check-drop-level-rolling-dirt-finish function) +;;(define-extern peeper-wait object) ;; unknown type +(define-extern fleeing-nav-enemy-chase-post-func function) +;;(define-extern lightning-mole-debug-blend object) ;; unknown type +;;(define-extern lightning-mole-hiding object) ;; unknown type +(define-extern peeper type) +(define-extern fleeing-nav-enemy-clip-travel function) +;;(define-extern fleeing-nav-enemy object) ;; unknown type +;;(define-extern robber-flee object) ;; unknown type +;;(define-extern robber-die object) ;; unknown type +(define-extern robber-find-ground function) +;;(define-extern robber-initial object) ;; unknown type +;;(define-extern *robber-sg* object) ;; unknown type +(define-extern robber-rotate function) +;;(define-extern fuel-cell-spline-slider object) ;; unknown type +(define-extern robber-event-handler function) +;;(define-extern robber-got-away object) ;; unknown type +(define-extern fuel-cell-init-as-spline-slider function) +;;(define-extern robber-tired object) ;; unknown type +(define-extern robber-calc-speed function) +;;(define-extern robber-initial-notice object) ;; unknown type +;;(define-extern robber-idle object) ;; unknown type +(define-extern robber-move function) +(define-extern robber type) +(define-extern robber-task-complete? function) +;;(define-extern robber-debug object) ;; unknown type +(define-extern robber-calc-anim-speed function) +;;(define-extern robber-dead object) ;; unknown type +;;(define-extern initial-spline-pos object) ;; unknown type +;;(define-extern race-ring-active object) ;; unknown type +(define-extern race-ring type) +(define-extern race-ring-set-particle-rotation-callback function) +(define-extern last-ring? function) +(define-extern race-ring-blue-set-particle-rotation-callback function) +(define-extern first-ring? function) +;;(define-extern race-ring-idle object) ;; unknown type +;;(define-extern *race-ring-sg* object) ;; unknown type +;;(define-extern race-ring-wait object) ;; unknown type +(define-extern balloon type) +;;(define-extern balloon-idle object) ;; unknown type +;;(define-extern *crate-darkeco-cluster-sg* object) ;; unknown type +;;(define-extern spike-down object) ;; unknown type +(define-extern spike type) +;;(define-extern spike-up object) ;; unknown type +;;(define-extern spike-idle object) ;; unknown type +;;(define-extern balloon-popping object) ;; unknown type +(define-extern crate-darkeco-cluster type) +;;(define-extern *spike-sg* object) ;; unknown type +;;(define-extern go-spike-up object) ;; unknown type +(define-extern ogre-part type) +;;(define-extern ogreboss-idle object) ;; unknown type +;;(define-extern *ogreboss-shoot-boulder-sg* object) ;; unknown type +(define-extern ogreboss-shoot-boulder function) +;;(define-extern ogreboss-stage1 object) ;; unknown type +;;(define-extern ogreboss-stage3-hit object) ;; unknown type +(define-extern ogreboss-super-boulder-event-handler function) +(define-extern ogreboss-move-near function) +;;(define-extern ogreboss-super-boulder-throw object) ;; unknown type +(define-extern ogreboss-update-shuffling function) +;;(define-extern *ogreboss-super-boulder-sg* object) ;; unknown type +;;(define-extern ogreboss-missile-idle object) ;; unknown type +;;(define-extern ogreboss-super-boulder-die object) ;; unknown type +(define-extern ogreboss-debug-adjust-difficulty function) +(define-extern ogreboss-roll-boulder function) +(define-extern ogreboss-super-boulder-play-hit-anim function) +(define-extern ogreboss-inc-try-count function) +;;(define-extern ogreboss-stage2 object) ;; unknown type +(define-extern ogreboss-post function) +;;(define-extern *ogreboss-shoot-boulder-break-sg* object) ;; unknown type +(define-extern ogreboss-super-boulder-impact-effect function) +(define-extern ogreboss-pick-target function) +(define-extern ogreboss-get-targets function) +(define-extern ogreboss-move-far function) +;;(define-extern ogreboss-missile object) ;; unknown type +;;(define-extern ogreboss-wait-for-player object) ;; unknown type +;;(define-extern *ogreboss-bounce-boulder-sg* object) ;; unknown type +;;(define-extern ogreboss-stage3-throw object) ;; unknown type +;;(define-extern *ogreboss-column-sg* object) ;; unknown type +;;(define-extern ogreboss-super-boulder-hit object) ;; unknown type +(define-extern ogreboss-spawn-super-boulder function) +;;(define-extern ogreboss-die object) ;; unknown type +;;(define-extern ogreboss-super-boulder-land object) ;; unknown type +;;(define-extern *ogreboss-sg* object) ;; unknown type +(define-extern ogreboss-player-inside-range? function) +;;(define-extern *ogreboss-missile-shadow-control* object) ;; unknown type +(define-extern ogreboss-bounce-boulder-init-by-other function) +(define-extern ogreboss-update-super-boulder function) +(define-extern ogreboss-super-boulder-init-by-other function) +(define-extern ogreboss-reset-camera function) +(define-extern ogreboss-trigger-steps function) +(define-extern ogreboss-bounce-boulder-event-handler function) +(define-extern ogreboss-blend-hit-anim function) +(define-extern ogreboss-missile-init-by-other function) +;;(define-extern ogreboss-super-boulder-roll object) ;; unknown type +(define-extern ogreboss-set-stage2-camera function) +(define-extern ogreboss-attack-event-handler function) +(define-extern ogreboss-missile-scale-explosion function) +(define-extern ogreboss-submerge function) +;;(define-extern ogreboss-super-boulder-idle object) ;; unknown type +(define-extern ogreboss-set-stage1-camera function) +(define-extern ogreboss-emerge function) +;;(define-extern ogreboss-dead object) ;; unknown type +;;(define-extern ogreboss-intro object) ;; unknown type +;;(define-extern *ogreboss-cam-sg* object) ;; unknown type +;;(define-extern ogreboss-stage3-shuffle object) ;; unknown type +;;(define-extern ogreboss-missile-impact object) ;; unknown type +(define-extern ogreboss-rock-explosion-effect function) +;;(define-extern *ogreboss-shadow-control* object) ;; unknown type +;;(define-extern ogreboss-super-boulder-killed-player object) ;; unknown type +;;(define-extern ogreboss-bounce-boulder-idle object) ;; unknown type +;;(define-extern ogreboss-missile-init-data object) ;; unknown type +;;(define-extern ogreboss-missile-seek object) ;; unknown type +(define-extern ogreboss-idle-loop function) +;;(define-extern ogreboss-bounce-boulder object) ;; unknown type +;;(define-extern go-hit object) ;; unknown type +;;(define-extern submerge1 object) ;; unknown type +;;(define-extern boulder object) ;; unknown type +;;(define-extern next-stage object) ;; unknown type +;;(define-extern submerge2 object) ;; unknown type +;;(define-extern emerge1 object) ;; unknown type +;;(define-extern emerge2 object) ;; unknown type +;;(define-extern target-actor object) ;; unknown type +;;(define-extern go-die object) ;; unknown type +;;(define-extern grow-faster object) ;; unknown type +;;(define-extern go-throw object) ;; unknown type +;;(define-extern break-no-damage object) ;; unknown type +;;(define-extern lava-ripple object) ;; unknown type +;;(define-extern speedup object) ;; unknown type +;;(define-extern *ogreboss* object) ;; unknown type +;;(define-extern *ogre-step-a-sg* object) ;; unknown type +;;(define-extern *shortcut-boulder-broken-sg* object) ;; unknown type +(define-extern ogre-bridge type) +;;(define-extern *ogre-bridgeend-sg* object) ;; unknown type +;;(define-extern ripple-for-ogre-lava object) ;; unknown type +;;(define-extern shortcut-boulder-idle object) ;; unknown type +;;(define-extern ogre-bridge-activated object) ;; unknown type +(define-extern tntbarrel type) +;;(define-extern ogre-bridgeend-idle object) ;; unknown type +(define-extern ogre-step-a type) +;;(define-extern *ogre-step-c-sg* object) ;; unknown type +(define-extern ogre-step-b type) +;;(define-extern ogre-bridge-activate object) ;; unknown type +;;(define-extern ogre-step object) ;; unknown type +;;(define-extern *ogre-bridge-joint-array* object) ;; unknown type +;;(define-extern *med-res-snow-sg* object) ;; unknown type +(define-extern ogre-step-c type) +(define-extern ogre-bridge-update-joints function) +(define-extern ogre-step-d type) +(define-extern shortcut-boulder type) +;;(define-extern *ogre-isle-b-sg* object) ;; unknown type +;;(define-extern *ogre-bridge-sg* object) ;; unknown type +(define-extern ogre-isle-b type) +;;(define-extern shortcut-boulder-break object) ;; unknown type +(define-extern ogre-isle-c type) +;;(define-extern *ogre-isle-a-sg* object) ;; unknown type +(define-extern ogre-isle-d type) +;;(define-extern ogre-bridge-idle object) ;; unknown type +;;(define-extern *ogre-isle-d-sg* object) ;; unknown type +;;(define-extern *shortcut-boulder-whole-sg* object) ;; unknown type +;;(define-extern *ogre-isle-constants* object) ;; unknown type +;;(define-extern *ogre-step-b-sg* object) ;; unknown type +;;(define-extern ogre-isle object) ;; unknown type +(define-extern ogre-bridgeend type) +;;(define-extern ogre-bridge-break object) ;; unknown type +;;(define-extern *tntbarrel-sg* object) ;; unknown type +;;(define-extern *ogre-isle-c-sg* object) ;; unknown type +;;(define-extern ogre-plat object) ;; unknown type +(define-extern ogre-lava type) +;;(define-extern *ogre-step-constants* object) ;; unknown type +;;(define-extern splash object) ;; unknown type +;;(define-extern die-big object) ;; unknown type +;;(define-extern flying-lurker-fly object) ;; unknown type +;;(define-extern flying-lurker-die object) ;; unknown type +;;(define-extern *plunger-lurker-sg* object) ;; unknown type +(define-extern flying-lurker-move function) +;;(define-extern flying-lurker-idle object) ;; unknown type +(define-extern flying-lurker-calc-anim-speed function) +(define-extern flying-lurker-handler function) +(define-extern flying-lurker-play-intro function) +;;(define-extern plunger-lurker-die object) ;; unknown type +;;(define-extern *ogrecam-sg* object) ;; unknown type +;;(define-extern flying-lurker-sleep object) ;; unknown type +(define-extern plunger-lurker type) +;;(define-extern flying-lurker-clone object) ;; unknown type +(define-extern flying-lurker-rotate function) +;;(define-extern *flying-lurker-sg* object) ;; unknown type +;;(define-extern flying-lurker-start object) ;; unknown type +(define-extern flying-lurker-calc-speed function) +(define-extern flying-lurker-inc-try-count function) +;;(define-extern plunger-lurker-flee object) ;; unknown type +(define-extern first? function) +;;(define-extern plunger-lurker-plunge object) ;; unknown type +(define-extern flying-lurker type) +(define-extern play-movie? function) +;;(define-extern plunger-lurker-idle object) ;; unknown type +;;(define-extern saw-player object) ;; unknown type +;;(define-extern clone-and-kill-links object) ;; unknown type +;;(define-extern sleep object) ;; unknown type +;;(define-extern plunge object) ;; unknown type +;;(define-extern fly-away object) ;; unknown type +(define-extern villagec-part type) +;;(define-extern *gondola-sg* object) ;; unknown type +(define-extern pistons type) +;;(define-extern *med-res-ogre2-sg* object) ;; unknown type +;;(define-extern *med-res-ogre-sg* object) ;; unknown type +;;(define-extern *med-res-finalboss-sg* object) ;; unknown type +;;(define-extern *pistons-sg* object) ;; unknown type +(define-extern gondola type) +(define-extern villagec-lava type) +;;(define-extern *gondolacables-sg* object) ;; unknown type +;;(define-extern ripple-for-villagec-lava object) ;; unknown type +;;(define-extern *med-res-ogre3-sg* object) ;; unknown type +(define-extern gondolacables type) +;;(define-extern ride-up object) ;; unknown type +;;(define-extern ride-down object) ;; unknown type +;;(define-extern *minecartsteel-sg* object) ;; unknown type +(define-extern minecartsteel-initialize-by-other function) +(define-extern minecartsteel type) +(define-extern minershort-trans-hook function) +(define-extern minertall type) +(define-extern miners-anim-loop function) +(define-extern cavegem type) +;;(define-extern *minertall-sg* object) ;; unknown type +(define-extern minershort type) +;;(define-extern *minershort-sg* object) ;; unknown type +;;(define-extern *cavegem-sg* object) ;; unknown type +(define-extern assistant-villagec type) +;;(define-extern *assistant-village3-sg* object) ;; unknown type +;;(define-extern *evilsis-village3-sg* object) ;; unknown type +;;(define-extern *evilbro-village3-sg* object) ;; unknown type +(define-extern sage-villagec type) +;;(define-extern *sage-village3-sg* object) ;; unknown type +(define-extern spider-vent type) +(define-extern cave-trap-default-event-handler function) +;;(define-extern cave-trap-idle object) ;; unknown type +;;(define-extern spawn-baby-spider-best object) ;; unknown type +;;(define-extern cave-trap-give-up object) ;; unknown type +;;(define-extern spider-vent-idle object) ;; unknown type +;;(define-extern cave-trap-active object) ;; unknown type +;;(define-extern spawn-baby-spider-work object) ;; unknown type +;;(define-extern can-spawn? object) ;; unknown type +(define-extern spider-egg type) +;;(define-extern notify-spawned object) ;; unknown type +;;(define-extern spider-egg-die object) ;; unknown type +;;(define-extern *spider-egg-broken-sg* object) ;; unknown type +;;(define-extern spider-egg-idle object) ;; unknown type +;;(define-extern spider-egg-hatch object) ;; unknown type +;;(define-extern *spider-egg-unbroken-sg* object) ;; unknown type +(define-extern robocave-part type) +(define-extern target-snowball-post function) +;;(define-extern snowball-info object) ;; unknown type +;;(define-extern *SNOWBALL-bank* object) ;; unknown type +;;(define-extern target-snowball object) ;; unknown type +(define-extern snowball-bank type) +(define-extern ice-cube-default-event-handler function) +;;(define-extern ice-cube-appear-land object) ;; unknown type +;;(define-extern ice-cube-retract-spikes object) ;; unknown type +;;(define-extern *ice-cube-nav-enemy-info* object) ;; unknown type +;;(define-extern *ice-cube-break-sg* object) ;; unknown type +;;(define-extern ice-cube-mean-turn-to-charge object) ;; unknown type +;;(define-extern *ice-cube-sg* object) ;; unknown type +;;(define-extern ice-cube-mean-charge-done object) ;; unknown type +;;(define-extern ice-cube-face-player object) ;; unknown type +;;(define-extern ice-cube-become-mean object) ;; unknown type +;;(define-extern ice-cube-trying-to-appear object) ;; unknown type +;;(define-extern ice-cube-shatter object) ;; unknown type +;;(define-extern ice-cube-tired object) ;; unknown type +;;(define-extern ice-cube-appear object) ;; unknown type +;;(define-extern ice-cube-mean-charge object) ;; unknown type +(define-extern ice-cube type) +(define-extern snow-ball-roller-path-update function) +;;(define-extern snow-ball-path-info object) ;; unknown type +;;(define-extern snow-ball-junction object) ;; unknown type +(define-extern snow-ball-roller-init-by-other function) +(define-extern snow-ball-roller-path-init function) +(define-extern snow-ball-shadow-init-by-other function) +;;(define-extern *snow-ball-shadow-control* object) ;; unknown type +;;(define-extern snow-ball-roller object) ;; unknown type +(define-extern snow-ball type) +;;(define-extern snow-ball-idle object) ;; unknown type +;;(define-extern *snow-ball-shadow-sg* object) ;; unknown type +;;(define-extern snow-ball-shadow object) ;; unknown type +;;(define-extern snow-ball-shadow-idle object) ;; unknown type +;;(define-extern *snow-ball-sg* object) ;; unknown type +;;(define-extern snow-ball-roller-idle object) ;; unknown type +;;(define-extern *snowpusher-sg* object) ;; unknown type +;;(define-extern snow-log-button-idle-up object) ;; unknown type +;;(define-extern snowcam object) ;; unknown type +;;(define-extern snow-gears-stopped object) ;; unknown type +;;(define-extern snow-gears-halt object) ;; unknown type +;;(define-extern snowpusher-idle object) ;; unknown type +;;(define-extern snow-log-button-idle-down object) ;; unknown type +(define-extern snow-fort-gate type) +;;(define-extern *snow-fort-gate-sg* object) ;; unknown type +(define-extern snow-log-button-event-handler function) +;;(define-extern snow-log-button-activate object) ;; unknown type +;;(define-extern snow-log-wait-for-master object) ;; unknown type +;;(define-extern snow-eggtop-idle-down object) ;; unknown type +;;(define-extern snow-fort-gate-idle-open object) ;; unknown type +;;(define-extern *snow-gears-sg* object) ;; unknown type +;;(define-extern *snow-eggtop-sg* object) ;; unknown type +;;(define-extern snow-switch-idle-down object) ;; unknown type +(define-extern snow-switch-event-handler function) +;;(define-extern snow-switch-activate object) ;; unknown type +(define-extern snow-log type) +(define-extern snowpusher type) +;;(define-extern *snow-switch-sg* object) ;; unknown type +(define-extern snow-switch type) +;;(define-extern snow-fort-gate-activate object) ;; unknown type +;;(define-extern snow-log-hidden object) ;; unknown type +;;(define-extern snow-eggtop-activate object) ;; unknown type +;;(define-extern snow-spatula-idle object) ;; unknown type +(define-extern snow-eggtop type) +;;(define-extern snow-gears-activate object) ;; unknown type +;;(define-extern snow-switch-idle-up object) ;; unknown type +;;(define-extern snow-log-activate object) ;; unknown type +(define-extern snow-gears type) +(define-extern snow-log-button type) +;;(define-extern *snowcam-sg* object) ;; unknown type +;;(define-extern snow-gears-idle object) ;; unknown type +(define-extern snow-spatula type) +;;(define-extern *snow-spatula-sg* object) ;; unknown type +;;(define-extern snow-fort-gate-idle-closed object) ;; unknown type +;;(define-extern *snow-log-sg* object) ;; unknown type +;;(define-extern snow-eggtop-idle-up object) ;; unknown type +;;(define-extern snow-log-active object) ;; unknown type +;;(define-extern cut object) ;; unknown type +;;(define-extern flutflut-plat-hide object) ;; unknown type +;;(define-extern elevator-travel-to-cave object) ;; unknown type +(define-extern flutflut-plat-small type) +;;(define-extern snow-button-deactivate object) ;; unknown type +;;(define-extern flutflut-plat object) ;; unknown type +;;(define-extern *flutflut-plat-small-sg* object) ;; unknown type +;;(define-extern flutflut-plat-appear object) ;; unknown type +;;(define-extern *flutflut-plat-large-sg* object) ;; unknown type +;;(define-extern elevator-idle-at-cave object) ;; unknown type +;;(define-extern *flutflut-plat-med-sg* object) ;; unknown type +;;(define-extern elevator-idle-at-fort object) ;; unknown type +;;(define-extern snow-button-activate object) ;; unknown type +(define-extern flutflut-plat-med type) +;;(define-extern snow-button-up-idle object) ;; unknown type +(define-extern flutflut-plat-large type) +;;(define-extern *snow-button-sg* object) ;; unknown type +;;(define-extern elevator-travel-to-fort object) ;; unknown type +;;(define-extern flutflut-plat-hidden-idle object) ;; unknown type +(define-extern snow-button type) +;;(define-extern snow-bumper-active-far-idle object) ;; unknown type +;;(define-extern snow-bumper-active-close-idle object) ;; unknown type +(define-extern snow-bumper type) +;;(define-extern snow-bumper-spawn-fuel-cell object) ;; unknown type +;;(define-extern *snow-bumper-sg* object) ;; unknown type +;;(define-extern snow-bumper-deactivate object) ;; unknown type +;;(define-extern snow-bumper-inactive-idle object) ;; unknown type +(define-extern ram type) +;;(define-extern ram-boss-forward-defend-block object) ;; unknown type +;;(define-extern *ram-boss-sg* object) ;; unknown type +;;(define-extern ram-boss-jump-down-hit-ground object) ;; unknown type +;;(define-extern ram-boss object) ;; unknown type +;;(define-extern ram-boss-proj-launch object) ;; unknown type +;;(define-extern ram-boss-tracking object) ;; unknown type +;;(define-extern *ram-boss-nav-enemy-info-no-shield* object) ;; unknown type +;;(define-extern ram-boss-up-defend-block object) ;; unknown type +;;(define-extern ram-boss-jump-down object) ;; unknown type +;;(define-extern ram-boss-already-down object) ;; unknown type +(define-extern snow-ram-proj-update-velocity function) +(define-extern ram-boss-on-ground-event-handler function) +(define-extern ram-boss-init-by-other function) +;;(define-extern ram-boss-show-anims object) ;; unknown type +;;(define-extern ram-boss-proj-growing object) ;; unknown type +;;(define-extern *ram-boss-nav-enemy-info* object) ;; unknown type +;;(define-extern ram-boss-nav-resume object) ;; unknown type +;;(define-extern ram-boss-throw object) ;; unknown type +;;(define-extern ram-boss-lose-shield object) ;; unknown type +;;(define-extern ram-boss-idle object) ;; unknown type +;;(define-extern ram-boss-nav-start object) ;; unknown type +;;(define-extern ram-boss-proj object) ;; unknown type +;;(define-extern snow-ram-proj object) ;; unknown type +;;(define-extern ram-idle object) ;; unknown type +;;(define-extern ram-fun-idle object) ;; unknown type +;;(define-extern *ram-sg* object) ;; unknown type +;;(define-extern ram-give-fuel-cell object) ;; unknown type +(define-extern sparticle-snow-birds-moon function) +(define-extern snow-part type) +(define-extern snow-bird-bob-func function) +;;(define-extern *yeti-nav-enemy-info* object) ;; unknown type +(define-extern yeti-slave-default-event-handler function) +;;(define-extern yeti-slave-appear-land object) ;; unknown type +;;(define-extern yeti-first-time-start object) ;; unknown type +(define-extern yeti-slave-init-by-other function) +;;(define-extern *yeti-sg* object) ;; unknown type +;;(define-extern yeti-slave object) ;; unknown type +;;(define-extern yeti-slave-appear-jump-up object) ;; unknown type +;;(define-extern yeti-resuming-start object) ;; unknown type +(define-extern yeti type) +;;(define-extern yeti-idle object) ;; unknown type +;;(define-extern yeti-slave-show-anims object) ;; unknown type +;;(define-extern spin-pole object) ;; unknown type +;;(define-extern iceskate object) ;; unknown type +(define-extern lavafallsewerb type) +;;(define-extern lavafall-idle object) ;; unknown type +(define-extern lavabase type) +;;(define-extern lavashortcut-idle object) ;; unknown type +;;(define-extern *lavafallsewerb-sg* object) ;; unknown type +(define-extern lavaballoon type) +(define-extern darkecobarrel-base-pos function) +(define-extern darkecobarrel-base-init function) +;;(define-extern darkecobarrel-mover-die object) ;; unknown type +;;(define-extern darkecobarrel-mover-move object) ;; unknown type +(define-extern lavatube-lava type) +;;(define-extern *darkecobarrel-sg* object) ;; unknown type +;;(define-extern darkecobarrel-spawner object) ;; unknown type +;;(define-extern lavafallsewera-idle object) ;; unknown type +(define-extern lavayellowtarp type) +;;(define-extern *lavayellowtarp-sg* object) ;; unknown type +(define-extern lavashortcut type) +;;(define-extern lavayellowtarp-idle object) ;; unknown type +(define-extern darkecobarrel-mover-init-by-other function) +(define-extern darkecobarrel-advance-curspawn function) +;;(define-extern lavafallsewerb-idle object) ;; unknown type +;;(define-extern darkecobarrel-leak object) ;; unknown type +(define-extern lavafall type) +;;(define-extern *lavabase-sg* object) ;; unknown type +;;(define-extern lavabase-idle object) ;; unknown type +;;(define-extern ripple-for-lavatube-lava object) ;; unknown type +(define-extern chainmine type) +;;(define-extern darkecobarrel-mover object) ;; unknown type +;;(define-extern darkecobarrel-base object) ;; unknown type +;;(define-extern *lavafall-sg* object) ;; unknown type +;;(define-extern *lavashortcut-sg* object) ;; unknown type +(define-extern darkecobarrel type) +(define-extern darkecobarrel-base-done? function) +(define-extern darkecobarrel-mover-pos function) +(define-extern lavafallsewera type) +;;(define-extern *lavafallsewera-sg* object) ;; unknown type +;;(define-extern *chainmine-sg* object) ;; unknown type +;;(define-extern *lavaballoon-sg* object) ;; unknown type +(define-extern darkecobarrel-base-time function) +(define-extern darkecobarrel-cycle-time function) +(define-extern energyhub-set-lava-height function) +;;(define-extern energybase-stopping object) ;; unknown type +;;(define-extern *energylava-sg* object) ;; unknown type +;;(define-extern energyhub-idle object) ;; unknown type +;;(define-extern energydoor-opened object) ;; unknown type +;;(define-extern energydoor-closed-till-task object) ;; unknown type +;;(define-extern energybase-idle object) ;; unknown type +(define-extern energydoor-closed-handler function) +;;(define-extern energyarm-no-ball object) ;; unknown type +;;(define-extern energyhub-stopped object) ;; unknown type +;;(define-extern energyball object) ;; unknown type +;;(define-extern energylava object) ;; unknown type +;;(define-extern *energydoor-sg* object) ;; unknown type +;;(define-extern energyball-idle object) ;; unknown type +;;(define-extern *energyhub-sg* object) ;; unknown type +;;(define-extern energyarm object) ;; unknown type +;;(define-extern *energyball-sg* object) ;; unknown type +(define-extern energyball-init function) +(define-extern energyarm-trans function) +(define-extern energyarm-init function) +(define-extern energydoor-open-handler function) +(define-extern energydoor type) +;;(define-extern *energybase-sg* object) ;; unknown type +(define-extern energyhub-trans function) +;;(define-extern energyhub-stop object) ;; unknown type +;;(define-extern energydoor-closed-till-near object) ;; unknown type +;;(define-extern energyarm-idle object) ;; unknown type +;;(define-extern energydoor-opening object) ;; unknown type +;;(define-extern energyarm-stop object) ;; unknown type +;;(define-extern energyarm-fall object) ;; unknown type +;;(define-extern energydoor-closing object) ;; unknown type +(define-extern energyarm-init-by-other function) +(define-extern energybase type) +;;(define-extern energylava-idle object) ;; unknown type +;;(define-extern *energyarm-sg* object) ;; unknown type +;;(define-extern energybase-stopped object) ;; unknown type +(define-extern energydoor-player-dist function) +(define-extern energyball-init-by-other function) +(define-extern energyhub type) +;;(define-extern open? object) ;; unknown type +(define-extern lavatube-part type) +;;(define-extern *assistant-lavatube-start-sg* object) ;; unknown type +(define-extern assistant-lavatube-start type) +;;(define-extern bubling-lava object) ;; unknown type +;;(define-extern lava-amb object) ;; unknown type +;;(define-extern lava-steam object) ;; unknown type +;;(define-extern lav-spin-gen object) ;; unknown type +;;(define-extern dril-step object) ;; unknown type +;;(define-extern drill-hit object) ;; unknown type +;;(define-extern drill-stop object) ;; unknown type +;;(define-extern drlurker-roar object) ;; unknown type +;;(define-extern gnawer-dies object) ;; unknown type +;;(define-extern gnawer-taunt object) ;; unknown type +;;(define-extern sounds object) ;; unknown type +;;(define-extern balloon-dies object) ;; unknown type +;;(define-extern binelurk-roar object) ;; unknown type +;;(define-extern bone-bigswing object) ;; unknown type +;;(define-extern bone-freehead object) ;; unknown type +;;(define-extern bone-helmet object) ;; unknown type +;;(define-extern bone-smallswing object) ;; unknown type +;;(define-extern bone-stepl object) ;; unknown type +;;(define-extern bone-stepr object) ;; unknown type +;;(define-extern bonelurk-raor object) ;; unknown type +;;(define-extern bonelurk-roar object) ;; unknown type +;;(define-extern bonelurker-dies object) ;; unknown type +;;(define-extern bonebridge-fall object) ;; unknown type +;;(define-extern muse-taunt-1 object) ;; unknown type +;;(define-extern muse-taunt-2 object) ;; unknown type +;;(define-extern walk-sand2 object) ;; unknown type +;;(define-extern mud-lurk-inhale object) ;; unknown type +;;(define-extern mud-lurk-laugh object) ;; unknown type +;;(define-extern mudlurker-dies object) ;; unknown type +;;(define-extern mudlurker-idle object) ;; unknown type +;;(define-extern qsl-fire object) ;; unknown type +;;(define-extern spooge1 object) ;; unknown type +;;(define-extern teeter-launch object) ;; unknown type +;;(define-extern teeter-rockland object) ;; unknown type +;;(define-extern teeter-wobble object) ;; unknown type +;;(define-extern teeter_rockup object) ;; unknown type +;;(define-extern walk-wood1 object) ;; unknown type +;;(define-extern arena object) ;; unknown type +;;(define-extern large-steam-lp object) ;; unknown type +;;(define-extern paddle-boat object) ;; unknown type +;;(define-extern flylurk-plane object) ;; unknown type +;;(define-extern flylurk-taunt object) ;; unknown type +;;(define-extern bridge-appears object) ;; unknown type +;;(define-extern bridge-breaks object) ;; unknown type +;;(define-extern rock-in-lava object) ;; unknown type +;;(define-extern group-ogreboss-boulder-splash object) ;; unknown type +;;(define-extern group-ogreboss-bounce-boulder-splash object) ;; unknown type +;;(define-extern group-ogreboss-column-break object) ;; unknown type +;;(define-extern group-ogreboss-lava-splash object) ;; unknown type +;;(define-extern hits-head object) ;; unknown type +;;(define-extern ogre-boulder object) ;; unknown type +;;(define-extern ogre-dies object) ;; unknown type +;;(define-extern ogre-roar2 object) ;; unknown type +;;(define-extern ogre-roar3 object) ;; unknown type +;;(define-extern ogre-throw object) ;; unknown type +;;(define-extern ogre-walk object) ;; unknown type +;;(define-extern ogre-windup object) ;; unknown type +;;(define-extern ogreboss-out object) ;; unknown type +;;(define-extern lava-loop object) ;; unknown type +;;(define-extern ogre-amb object) ;; unknown type +;;(define-extern village2-amb object) ;; unknown type +;;(define-extern plant-dies object) ;; unknown type +;;(define-extern plant-move object) ;; unknown type +;;(define-extern get-mole object) ;; unknown type +;;(define-extern mole-taunt-1 object) ;; unknown type +;;(define-extern mole-taunt-2 object) ;; unknown type +;;(define-extern piston-open object) ;; unknown type +;;(define-extern robber-dies object) ;; unknown type +;;(define-extern robber-flap object) ;; unknown type +;;(define-extern robber-taunt object) ;; unknown type +;;(define-extern mole-dig object) ;; unknown type +;;(define-extern roling-amb object) ;; unknown type +;;(define-extern #t) object) ;; unknown type +;;(define-extern group-ice-cube-foot-puff object) ;; unknown type +;;(define-extern ice-breathin object) ;; unknown type +;;(define-extern ice-monster1 object) ;; unknown type +;;(define-extern ice-monster2 object) ;; unknown type +;;(define-extern ice-monster4 object) ;; unknown type +;;(define-extern ice-spike-in object) ;; unknown type +;;(define-extern ice-spike-out object) ;; unknown type +;;(define-extern icelurk-land object) ;; unknown type +;;(define-extern icelurk-step object) ;; unknown type +;;(define-extern group-ram-boss-foot-puff object) ;; unknown type +;;(define-extern ice-monster3 object) ;; unknown type +;;(define-extern ramboss-land object) ;; unknown type +;;(define-extern ramboss-laugh object) ;; unknown type +;;(define-extern ramboss-shield object) ;; unknown type +;;(define-extern ramboss-step object) ;; unknown type +;;(define-extern ramboss-yell object) ;; unknown type +;;(define-extern babak-death object) ;; unknown type +;;(define-extern burst-out object) ;; unknown type +;;(define-extern winter-amb object) ;; unknown type +;;(define-extern bully-dies object) ;; unknown type +;;(define-extern bully-jump object) ;; unknown type +;;(define-extern bully-land object) ;; unknown type +;;(define-extern bully-spin1 object) ;; unknown type +;;(define-extern bully-spin2 object) ;; unknown type +;;(define-extern split-steps object) ;; unknown type +;;(define-extern splitb-breathin object) ;; unknown type +;;(define-extern splitb-dies object) ;; unknown type +;;(define-extern splitb-roar object) ;; unknown type +;;(define-extern splitb-roars object) ;; unknown type +;;(define-extern splitb-spot object) ;; unknown type +;;(define-extern splitb-taunt object) ;; unknown type +;;(define-extern splita-charge object) ;; unknown type +;;(define-extern splita-dies object) ;; unknown type +;;(define-extern splita-roar object) ;; unknown type +;;(define-extern splita-spot object) ;; unknown type +;;(define-extern splita-taunt object) ;; unknown type +;;(define-extern chamber-land object) ;; unknown type +;;(define-extern chamber-lift object) ;; unknown type +;;(define-extern submerge object) ;; unknown type +;;(define-extern puffer-change object) ;; unknown type +;;(define-extern puffer-wing object) ;; unknown type +;;(define-extern path1 object) ;; unknown type +;;(define-extern path1-k object) ;; unknown type +;;(define-extern path2 object) ;; unknown type +;;(define-extern path2-k object) ;; unknown type +;;(define-extern path3 object) ;; unknown type +;;(define-extern path3-k object) ;; unknown type +;;(define-extern path4 object) ;; unknown type +;;(define-extern path4-k object) ;; unknown type +;;(define-extern path5 object) ;; unknown type +;;(define-extern path5-k object) ;; unknown type +;;(define-extern path6 object) ;; unknown type +;;(define-extern path6-k object) ;; unknown type +;;(define-extern path7 object) ;; unknown type +;;(define-extern path7-k object) ;; unknown type +;;(define-extern path8 object) ;; unknown type +;;(define-extern path8-k object) ;; unknown type +;;(define-extern sunken-amb object) ;; unknown type +;;(define-extern kermit-dies object) ;; unknown type +;;(define-extern kermit-letgo object) ;; unknown type +;;(define-extern kermit-shoot object) ;; unknown type +;;(define-extern kermit-speak1 object) ;; unknown type +;;(define-extern kermit-speak2 object) ;; unknown type +;;(define-extern bat-celebrate object) ;; unknown type +;;(define-extern lurkbat-dies object) ;; unknown type +;;(define-extern lurkbat-idle object) ;; unknown type +;;(define-extern lurkbat-wing object) ;; unknown type +;;(define-extern -2 object) ;; unknown type +;;(define-extern 0 object) ;; unknown type +;;(define-extern 1 object) ;; unknown type +;;(define-extern 100 object) ;; unknown type +;;(define-extern 3 object) ;; unknown type +;;(define-extern 4 object) ;; unknown type +;;(define-extern 5 object) ;; unknown type +;;(define-extern 6 object) ;; unknown type +;;(define-extern lurkrat-bounce object) ;; unknown type +;;(define-extern lurkrat-dies object) ;; unknown type +;;(define-extern lurkrat-fall object) ;; unknown type +;;(define-extern lurkrat-idle object) ;; unknown type +;;(define-extern lurkrat-notice object) ;; unknown type +;;(define-extern lurkrat-walk object) ;; unknown type +;;(define-extern rat-celebrate object) ;; unknown type +;;(define-extern pole-down object) ;; unknown type +;;(define-extern pole-up object) ;; unknown type +;;(define-extern pathb-k object) ;; unknown type +;;(define-extern swamp-amb object) ;; unknown type +(define-extern logo-slave-init-by-other function) +;;(define-extern target-title-wait object) ;; unknown type +;;(define-extern *logo-sg* object) ;; unknown type +;;(define-extern target-title-play object) ;; unknown type +;;(define-extern *logo-japan-sg* object) ;; unknown type +;;(define-extern logo-slave object) ;; unknown type +;;(define-extern *ndi-volumes-sg* object) ;; unknown type +;;(define-extern *logo-black-sg* object) ;; unknown type +;;(define-extern *ndi-cam-sg* object) ;; unknown type +(define-extern logo-init-by-other function) +;;(define-extern *logo-volumes-sg* object) ;; unknown type +;;(define-extern *ndi-sg* object) ;; unknown type +;;(define-extern *logo-cam-sg* object) ;; unknown type +;;(define-extern *logo-volumes-japan-sg* object) ;; unknown type +;;(define-extern ndi object) ;; unknown type +;;(define-extern startup object) ;; unknown type +;;(define-extern break-dummy object) ;; unknown type +;;(define-extern training-amb object) ;; unknown type +;;(define-extern water-lap-cls object) ;; unknown type +;;(define-extern walk-wood2 object) ;; unknown type +;;(define-extern yakow-grazing object) ;; unknown type +;;(define-extern 11 object) ;; unknown type +;;(define-extern 12 object) ;; unknown type +;;(define-extern 50 object) ;; unknown type +;;(define-extern bird-1 object) ;; unknown type +;;(define-extern bird-3 object) ;; unknown type +;;(define-extern bird-4 object) ;; unknown type +;;(define-extern bird-house object) ;; unknown type +;;(define-extern bubbling-still object) ;; unknown type +;;(define-extern cage-bird-2 object) ;; unknown type +;;(define-extern cage-bird-4 object) ;; unknown type +;;(define-extern cage-bird-5 object) ;; unknown type +;;(define-extern fire-bubble object) ;; unknown type +;;(define-extern fire-crackle object) ;; unknown type +;;(define-extern fly1 object) ;; unknown type +;;(define-extern fly2 object) ;; unknown type +;;(define-extern fly3 object) ;; unknown type +;;(define-extern fly4 object) ;; unknown type +;;(define-extern fly5 object) ;; unknown type +;;(define-extern fly6 object) ;; unknown type +;;(define-extern fly7 object) ;; unknown type +;;(define-extern fly8 object) ;; unknown type +;;(define-extern fountain object) ;; unknown type +;;(define-extern gear-creak object) ;; unknown type +;;(define-extern hover-bike-hum object) ;; unknown type +;;(define-extern seagulls-2 object) ;; unknown type +(define-extern evilplant type) +;;(define-extern meteor object) ;; unknown type +;;(define-extern v2ogre-roar1 object) ;; unknown type +;;(define-extern v2ogre-roar2 object) ;; unknown type +;;(define-extern control-panel object) ;; unknown type +;;(define-extern fire-boulder object) ;; unknown type +;;(define-extern flame-pot object) ;; unknown type +;;(define-extern sages-machine object) ;; unknown type +;;(define-extern wind-chimes object) ;; unknown type +;;(define-extern lava-erupt object) ;; unknown type +;;(define-extern miners-fire object) ;; unknown type +;;(define-extern small-steam object) ;; unknown type +;;(define-extern steam-large object) ;; unknown type +;;(define-extern steam-medium object) ;; unknown type +;;(define-extern steam-small object) ;; unknown type +;;(define-extern sulphur object) ;; unknown type +(define-extern lavaspoutdrip type) +;;(define-extern ripple-for-lava object) ;; unknown type + diff --git a/decompiler/config/jak1_ntsc_black_label.jsonc b/decompiler/config/jak1_ntsc_black_label.jsonc index e1b8dd8a0f..ee8b6740ca 100644 --- a/decompiler/config/jak1_ntsc_black_label.jsonc +++ b/decompiler/config/jak1_ntsc_black_label.jsonc @@ -3,13 +3,14 @@ { "game_version":1, // the order here matters. KERNEL and GAME should go first - "dgo_names":["CGO/KERNEL.CGO" - , "CGO/GAME.CGO", "CGO/ENGINE.CGO" + "dgo_names":["CGO/KERNEL.CGO", "CGO/GAME.CGO"], + /*, "CGO/ENGINE.CGO" , "CGO/ART.CGO", "DGO/BEA.DGO", "DGO/CIT.DGO", "CGO/COMMON.CGO", "DGO/DAR.DGO", "DGO/DEM.DGO", "DGO/FIN.DGO", "DGO/INT.DGO", "DGO/JUB.DGO", "DGO/JUN.DGO", "CGO/JUNGLE.CGO", "CGO/L1.CGO", "DGO/FIC.DGO", "DGO/LAV.DGO", "DGO/MAI.DGO", "CGO/MAINCAVE.CGO", "DGO/MIS.DGO", "DGO/OGR.DGO", "CGO/RACERP.CGO", "DGO/ROB.DGO", "DGO/ROL.DGO", "DGO/SNO.DGO", "DGO/SUB.DGO", "DGO/SUN.DGO", "CGO/SUNKEN.CGO", "DGO/SWA.DGO", "DGO/TIT.DGO", "DGO/TRA.DGO", "DGO/VI1.DGO", - "DGO/VI2.DGO", "DGO/VI3.DGO", "CGO/VILLAGEP.CGO", "CGO/WATER-AN.CGO"], + "DGO/VI2.DGO", "DGO/VI3.DGO", "CGO/VILLAGEP.CGO", "CGO/WATER-AN.CGO" + ],*/ "write_disassembly":true, "write_hex_near_instructions":false, @@ -29,9 +30,16 @@ "asm_functions_by_name":[ // gcommon - "ash", "abs", "min", "max", "collide-do-primitives", "draw-bones-check-longest-edge-asm", + "ash", "abs", "min", "max", "(method 2 vec4s)", "quad-copy!", "(method 3 vec4s)", "breakpoint-range-set!", + + // pskernel + "resend-exception", "kernel-set-interrupt-vector", "kernel-set-exception-vector", "return-from-exception", + "kernel-read", "kernel-read-function", "kernel-write", "kernel-write-function", "kernel-copy-to-kernel-ram", + + "collide-do-primitives", "draw-bones-check-longest-edge-asm", "sp-launch-particles-var", "(method 15 collide-shape-prim-mesh)", "(method 15 collide-shape-prim-sphere)", - "(method 45 collide-shape)", "cam-layout-save-cam-trans", "kernel-copy-function", "dma-sync-hang", "generic-no-light-dproc", "dma-sync-fast", "bsp-camera-asm", + "(method 45 collide-shape)", "cam-layout-save-cam-trans", "kernel-copy-function", "dma-sync-hang", "generic-no-light-dproc", + "dma-sync-fast", "bsp-camera-asm", "generic-none-dma-wait", "unpack-comp-rle", "level-remap-texture", "(method 10 collide-edge-hold-list)" ] } \ No newline at end of file diff --git a/decompiler/main.cpp b/decompiler/main.cpp index 85d63c64a2..1119924e4b 100644 --- a/decompiler/main.cpp +++ b/decompiler/main.cpp @@ -4,7 +4,7 @@ #include "ObjectFile/ObjectFileDB.h" #include "config.h" #include "util/FileIO.h" -#include "TypeSystem/TypeInfo.h" + #include "common/util/FileUtil.h" int main(int argc, char** argv) { @@ -48,8 +48,9 @@ int main(int argc, char** argv) { db.write_disassembly(out_folder, get_config().disassemble_objects_without_functions); } - printf("%s\n", get_type_info().get_summary().c_str()); - // printf("%d\n", InstructionKind::EE_OP_MAX); - // printf("%s\n", get_type_info().get_all_symbols_debug().c_str()); + // todo print type summary + // printf("%s\n", get_type_info().get_summary().c_str()); + + file_util::write_text_file(combine_path(out_folder, "all-syms.gc"), db.dts.dump_symbol_types()); return 0; } diff --git a/decompiler/util/DecompilerTypeSystem.cpp b/decompiler/util/DecompilerTypeSystem.cpp new file mode 100644 index 0000000000..e748b3492b --- /dev/null +++ b/decompiler/util/DecompilerTypeSystem.cpp @@ -0,0 +1,78 @@ +#include "DecompilerTypeSystem.h" +#include "common/goos/Reader.h" +#include "common/type_system/deftype.h" + +DecompilerTypeSystem::DecompilerTypeSystem() { + ts.add_builtin_types(); +} + +namespace { +// some utilities for parsing the type def file + +goos::Object& car(goos::Object& pair) { + if (pair.is_pair()) { + return pair.as_pair()->car; + } else { + throw std::runtime_error("car called on something that wasn't a pair: " + pair.print()); + } +} + +goos::Object& cdr(goos::Object& pair) { + if (pair.is_pair()) { + return pair.as_pair()->cdr; + } else { + throw std::runtime_error("cdr called on something that wasn't a pair"); + } +} + +template +void for_each_in_list(goos::Object& list, T f) { + goos::Object* iter = &list; + while (iter->is_pair()) { + f(car(*iter)); + iter = &cdr(*iter); + } + + if (!iter->is_empty_list()) { + throw std::runtime_error("malformed list"); + } +} +} // namespace + +void DecompilerTypeSystem::parse_type_defs(const std::vector& file_path) { + goos::Reader reader; + auto read = reader.read_from_file(file_path); + auto data = cdr(read); + + for_each_in_list(data, [&](goos::Object& o) { + if (car(o).as_symbol()->name == "define-extern") { + auto* rest = &cdr(o); + auto sym_name = car(*rest); + rest = &cdr(*rest); + auto sym_type = car(*rest); + if (!cdr(*rest).is_empty_list()) { + throw std::runtime_error("malformed define-extern"); + } + add_symbol(sym_name.as_symbol()->name, parse_typespec(&ts, sym_type)); + + } else if (car(o).as_symbol()->name == "deftype") { + parse_deftype(cdr(o), &ts); + } else { + throw std::runtime_error("Decompiler cannot parse " + car(o).print()); + } + }); +} + +std::string DecompilerTypeSystem::dump_symbol_types() { + assert(symbol_add_order.size() == symbols.size()); + std::string result; + for (auto& symbol_name : symbol_add_order) { + auto skv = symbol_types.find(symbol_name); + if (skv == symbol_types.end()) { + result += fmt::format(";;(define-extern {} object) ;; unknown type\n", symbol_name); + } else { + result += fmt::format("(define-extern {} {})\n", symbol_name, skv->second.print()); + } + } + return result; +} \ No newline at end of file diff --git a/decompiler/util/DecompilerTypeSystem.h b/decompiler/util/DecompilerTypeSystem.h new file mode 100644 index 0000000000..a38d447837 --- /dev/null +++ b/decompiler/util/DecompilerTypeSystem.h @@ -0,0 +1,46 @@ +#ifndef JAK_DECOMPILERTYPESYSTEM_H +#define JAK_DECOMPILERTYPESYSTEM_H + +#include "common/type_system/TypeSystem.h" +#include "third-party/fmt/format.h" + +class DecompilerTypeSystem { + public: + DecompilerTypeSystem(); + TypeSystem ts; + std::unordered_map symbol_types; + std::unordered_set symbols; + std::vector symbol_add_order; + + void add_symbol(const std::string& name) { + if (symbols.find(name) == symbols.end()) { + symbols.insert(name); + symbol_add_order.push_back(name); + } + } + + void add_symbol(const std::string& name, const std::string& base_type) { + add_symbol(name, TypeSpec(base_type)); + } + + void add_symbol(const std::string& name, const TypeSpec& type_spec) { + add_symbol(name); + auto skv = symbol_types.find(name); + if (skv == symbol_types.end() || skv->second == type_spec) { + symbol_types[name] = type_spec; + } else { + if (ts.typecheck(type_spec, skv->second, "", false, false)) { + } else { + fmt::print("Attempting to redefine type of symbol {} from {} to {}\n", name, + skv->second.print(), type_spec.print()); + throw std::runtime_error("Type redefinition"); + } + } + } + + void parse_type_defs(const std::vector& file_path); + + std::string dump_symbol_types(); +}; + +#endif // JAK_DECOMPILERTYPESYSTEM_H diff --git a/decompiler/util/LispPrint.cpp b/decompiler/util/LispPrint.cpp index 3031cd7ead..3e0919a954 100644 --- a/decompiler/util/LispPrint.cpp +++ b/decompiler/util/LispPrint.cpp @@ -514,3 +514,14 @@ std::shared_ptr buildList(std::vector>& forms) { } return buildList(forms.data(), forms.size()); } + +std::shared_ptr buildList(std::vector& forms) { + if (forms.empty()) { + return gSymbolTable.getEmptyPair(); + } + std::vector> f; + for (auto& x : forms) { + f.push_back(toForm(x)); + } + return buildList(f.data(), f.size()); +} \ No newline at end of file diff --git a/decompiler/util/LispPrint.h b/decompiler/util/LispPrint.h index a1b964dbdd..58fd68feae 100644 --- a/decompiler/util/LispPrint.h +++ b/decompiler/util/LispPrint.h @@ -122,6 +122,7 @@ std::shared_ptr buildList(const std::string& str); std::shared_ptr buildList(std::shared_ptr form); std::shared_ptr buildList(std::vector>& forms); std::shared_ptr buildList(std::shared_ptr* forms, int count); +std::shared_ptr buildList(std::vector& forms); template std::shared_ptr buildList(const std::string& str, Args... rest) { diff --git a/doc/changelog.md b/doc/changelog.md new file mode 100644 index 0000000000..d48f86c0a0 --- /dev/null +++ b/doc/changelog.md @@ -0,0 +1,21 @@ +# Language Changes + +## V0.1 +- The GOAL language version has been set to 0.1 +- Calling a function with unknown argument/return types is now an error instead of a warning +- Getting a method of an object or type with `method` returns the correct type for methods using the `_type_` feature +- The `object-new` macro will now type check arguments +- The size argument to `(method object new)` is now an `int` instead of `int32` +- Using `set!` incorrectly, like `(set! 1 2)` will now create an error instead of having no effect +- GOOS now has a `fmt` form which wraps `libfmt` for doing string formatting. +- GOOS now has an `error` form for throwing an error with a string to describe it +- GOAL `if` now throws errors on extra arguments instead of silently ignoring them +- The first 1 MB of GOAL memory now cannot be read/written/executed so dereferencing a GOAL null pointer will now segfault +- The runtime now accepts command line boot arguments +- The runtime now defaults to loading `KERNEL.CGO` and using its `kernel-dispatcher` function. +- The runtime now accepts a `-nokernel` parameter for running without `KERNEL.CGO`. +- The runtime will now refuse to load object files from another major GOAL version +- Using `&+` and `&+!` now produces a pointer with the same type as the original. +- There is a `&-` which returns a `uint` and works with basically any input types +- The `&` operator works on fields and elements in arrays +- The `&->` operator has been added \ No newline at end of file diff --git a/doc/decompilation_notes.md b/doc/decompilation_notes.md new file mode 100644 index 0000000000..e4879e6910 --- /dev/null +++ b/doc/decompilation_notes.md @@ -0,0 +1,277 @@ +# GOAL Operations + +## `div.s` +Suspected source +``` +(/ 1.0 x) +``` +where `x` is in a GPR: +``` + lwc1 f0, L345(fp) ;; first argument prepared first? + mtc1 f1, a0 ;; second argument prepared second? + div.s f0, f0, f1 +``` +Sequence +- Compile first +- First to FPR +- Compile second +- Second to FPR + +## `daddu` +Used for `int` and `uint` addition. + +Two element form: +``` +daddu v0, a0, a1 +``` +is `(+ a0 a1)` - the order in the opcode matches the order in the expression. + +## `daddiu` to get a symbol +``` +daddiu v0, s7, #t +``` +Note for `#t`: `#t` is linked when the code literally has a `#t` in it. Other cases are currently unknown. + +## `dsubu` +Used for `int` and `uint` subtraction. + +## `mult3` (EE `mult`) +Used for `int` multiplication. + +Like `daddu` for opcode ordering: +``` +mult3 v0, a0, a1 +``` +is `(* a0 a1)`. + +## `div` +Used for `int` division. + +``` + div a0, a1 + mflo v0 +``` +is `(/ a0 a1)`. + +and also for `int` mod +``` + div a0, a1 + mfhi v0 +``` +## `or` used to get the value of false +``` +or v0, s7, r0 +``` + +## `or` used as a bitwise or +``` +or v0, a0, a1 +``` +is `(logior a0 a1)` + +## `and` used as a bitwise and +``` +and v0, a0, a1 +``` +is `(logand a0 a1)`. + +``` +(logand #xfffffff0 (+ (ash (-> thing field) 2) 43)) +``` +is +``` + ld v1, L346(fp) ;; first arg to the and + lhu a0, 14(a0) ;; second arg evaluation... + dsll a0, a0, 2 + daddiu a0, a0, 43 + and v0, v1, a0 ;; and result, first, second +``` + +## `nor` used as a bitwise nor +``` +nor v0, a0, a1 +``` +is `(lognor a0 a1)` + +## `xor` used as a bitwise xor +``` +xor v0, a0, a1 +``` +is `(logxor a0 a1)` + +## `nor` used as a logical not +``` +nor v0, a0, r0 +``` +is `(lognot a0)` + + + +# Common "Idioms" + +## `ash` +Variable shift (`ash`) is an inline function +``` + or v1, a0, r0 + bgezl a1, L306 + dsllv v0, v1, a1 + + dsubu a0, r0, a1 + dsrav v0, v1, a0 +L306: +``` + +## `abs` of integer +``` + or v0, a0, r0 + bltzl v0, L302 + dsubu v0, r0, v0 +L302: +``` + +## `min` of integers +``` + or v0, a0, r0 + or v1, a1, r0 + slt a0, v0, v1 + movz v0, v1, a0 +``` + +## `max` of integers +``` + or v0, a0, r0 + or v1, a1, r0 + slt a0, v0, v1 + movn v0, v1, a0 +``` + +# Others + +## Integer constants that are large +A constant of `0xfffffff0` is loaded with `ld` + +## Access value of symbol +Seems to always use `lw`? + +# Control Flow Info + + +## Begin-like forms flush everything always, immediately after compiling +Example in `vector` with flushing: +``` +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; .function vector3s+! +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +L8: + daddiu sp, sp, -16 + sd fp, 8(sp) + or fp, t9, r0 + daddiu v1, fp, L109 ;; string: "Add 2 vectors3." + lwc1 f0, 0(a1) + lwc1 f1, 0(a2) + add.s f0, f0, f1 + swc1 f0, 0(a0) + lwc1 f0, 4(a1) + lwc1 f1, 4(a2) + add.s f0, f0, f1 + swc1 f0, 4(a0) + lwc1 f0, 8(a1) + lwc1 f1, 8(a2) + add.s f0, f0, f1 + swc1 f0, 8(a0) + or v0, a0, r0 + ld fp, 8(sp) + jr ra + daddiu sp, sp, 16 +``` +The `daddiu v1, fp, L109` loads a `string` into the `v1` register which is never used, immediately after the prologue. This will only happen if the value is flushed. This is very likely a documentation comment that accidentally got included as a string constant. It's unused, so there was likely no consumer of the string that did the `flush` - it was done by the top level evaluation. +``` +(defun vector3s+! (stuff) + "Add 2 vectors3." ;; oops, a string constant instead of a comment. + ... ; rest of the function +) +``` +## Return-From evaluates to 0 bug +We would expect the value of `(return-from #f x)` to be nothing, as there's no possible way to use it. However, GOAL seems to have a small bug where `(return-from #f x)` always attempts to evaluate to 0. This would be like implementing it as: +```lisp +(set! retrun-reg return-value) +(goto end-of-function) +0 ;; oops +``` +by accident. + +Example in GOAL: + +``` +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; .function basic-type? (in gcommon) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +L285: + lwu v1, -4(a0) + lw a0, object(s7) +L286: + bne v1, a1, L287 + or a2, s7, r0 + ; (return-from #f #t) starts here + daddiu v1, s7, #t ; compile/flush the #t + or v0, v1, r0 ; move to return register + beq r0, r0, L288 ; branch to end + sll r0, r0, 0 ; branch delay slot (usual filler) + + or v1, r0, r0 ; unreachable loading of 0 into a register. +L287: + lwu v1, 4(v1) + bne v1, a0, L286 + sll r0, r0, 0 + + or v0, s7, r0 +L288: + jr ra + daddu sp, sp, r0 + + sll r0, r0, 0 + sll r0, r0, 0 +``` + +## Unused else case returning false in cond +From `delete!` in gcommon. +``` + beq a2, a0, L222 ; (if (= a2 a0) only-one-case) + or a0, s7, r0 ; a0 is unused return value of if + + lw a0, 2(a2) ; (set! (cdr v1) (cdr a2)), will evaluate to (cdr a2) which is stored in a0 + sw a0, 2(v1) +L222: ; a0 = #f or a0 = (cdr a2) depending on branch taken, but it's totally unused! + or v0, a1, r0 ; return a1 + jr ra + daddu sp, sp, r0 +``` +Also note that all cases stored their result in `a0`, even though nothing uses the result. + +## Function Calls evaluate arguments in order: +``` + lw t9, format(s7) ;; head of function + daddiu a0, s7, #t ;; first arg + daddiu a1, fp, L344 ;; second arg + sllv a2, gp, r0 ;; third arg + dsra32 a3, gp, 0 ;; fourth arg + pcpyud v1, gp, r0 + sllv t0, v1, r0 ;; fifth arg + pcpyud v1, gp, r0 + dsra32 t1, v1, 0 ;; sixth arg + por t2, gp, r0 ;; seventh arg + jalr ra, t9 + sll v0, ra, 0 +``` +also an example of lack of common subexpression elimination on the `pcpyud v1, gp, r0`s. + +### A second example with register type conversions: +``` + lw t9, format(s7) ;; function + daddiu a0, s7, #t ;; first arg + daddiu a1, fp, L343 ;; second arg + lwc1 f0, 0(gp) ;; compile and flush third arg + mfc1 a2, f0 ;; move to correct reg type + jalr ra, t9 + sll v0, ra, 0 +``` \ No newline at end of file diff --git a/doc/goal_doc.md b/doc/goal_doc.md new file mode 100644 index 0000000000..8518c55a18 --- /dev/null +++ b/doc/goal_doc.md @@ -0,0 +1,1001 @@ +# OpenGOAL Document +This is the main documentation for the OpenGOAL language. It explains the syntax of OpenGOAL programs and also how OpenGOAL can be decompiled from original GOAL. It's broken up into three sections: + +1. Compiler forms, which are things built-in to the compiler and have names. Like `+` or `deftype`. +2. Important Syntax Macros, which are really important features of the languages that are implemented as macros, like `if` and `defun`. +3. Compiler features, which are things that are built-in to the compiler but don't have explicit names. Like calling functions or the rules for how names are scoped. +4. Built-in types + +Each feature will have a description, explanation of the syntax, a guess at how often it's used, an example or two in OpenGOAL, and an example or two in MIPS GOAL. There will also be details on the order of evaluation that is useful for the decompiler but can mostly be ignored for normal programming in OpenGAL. + +The syntax description uses these rules: +- Something `[in-brackets]` is optional and can be left out. +- Something like `[:type type-name]` means there is an optional named argument. It can be used like `:type type-name`, replacing `type-name` with what you want, or left out entirely. +- When there are multiple choices, they are separated by `|`. Example: `#t|#f` is either `#t` or `#f`. +- A `...` means more of the thing before can be included. Example `(f arg...)` can have multiple arguments. + +When talking about ordering things, GOAL code fragments can be `compile`d and `flush`ed as two separate things. For the most part, everything is done during compilation, like calling functions. But consider `(set! (-> my-object value) x)`. We don't actually want the value of `(-> my-object value)`, we want to set its value. The `compile` stage gets us description of how to read/write a thing (if possible), and the `flush` stage gets us an actual value in a register. This can basically be ignored outside of the decompiler. + + +# Compiler Forms - Block Related + +## `begin` +Execute forms in order. +```lisp +(begin form...) +``` +A `begin` form is just a list of other forms which are executed in order. A `begin` form evaluates to the value of the last form. + +Example: +```lisp +(begin + (print "hello ") + (print "world!") + 7 + ) +``` +will print `hello world!` and the value of the entire form is `7`. + +In `begin` and similar "do everything in the list" forms, each form is `compile`d then `flush`ed. + +The `begin` form is used a lot in macros, but not that much in code. It's generally used when you want to execute multiple things, but fit it into a single form. + + +## `block` +A `block` form is pretty similar to a `begin`, except the `block` has a name. You can then "return" from the block early with `return-from`. +```lisp +(block block-name form...) +``` + +Example: +```lisp +(block my-block + (print "hello ") + (return-from my-block 7) + (print "world") + "test" + ) +``` +will print `hello ` only and the value of the entire `block` form is `7`. The type of the `block` is the most specific type that describes all of the possible return values from any `return-from` or from reaching the end (even if its technically not possible to reach the end). In the case above, the possible return types are `int` and `string`, so the return type of the whole block is `object`, the lowest common ancestor type of `int` and `string`. + +Block is used rarely, and possibly almost never? + +## `return-from` +Exit a `block` or function early. +```lisp +(return-from block-name value) +``` + +Looks up the block and exits from it with the value. You can exit out nested blocks. If you are enclosed in multiple blocks with the same name, exits from the inner-most one with a matching name. Everything in a function is wrapped in a block named `#f`, so you can use `(return-from #f x)` to return early from a function with `x`. Unlike returning from a block, using `return-from` to exit a function currently does _not_ modify the return type of your function and does _not_ check the type of what you return. + +Example +```lisp +(if (is-a-match? x) + (return-from #f x) + ) +``` +if `x` is a match, returns `x` from the function (not shown) immediately. + +The `return-from` form is very rarely used to return from a block, but sometimes used to return from a function. + +## `label` +Create a named label for `goto` or `goto-when`. +```lisp +(label label-name) +``` +The label spaces are per-function and not nested. You can't jump from function to function. You can't jump in or out of functions which end up getting inlined. You can't jump in or out of an anonymous lambda function. You can jump in and out of `let`s. + +See `goto` for an example. + +Labels are used extremely rarely. Usually only in inline assembly and part of macros for `while` loops and similar. + +## `goto` +Jump to a label. +```lisp +(goto label-name) +``` +The label must be in the current label space. You can jump forward or backward. + +Example: +```lisp +(if skip-code? + (goto end) + ) + +;; code here runs only if skip-code is false. + +(label end) +``` + +The `goto` form used very rarely outside of macros and inline assembly. Try to avoid using `goto`. + +# Compiler Forms - Compiler Control +These forms are used to control the GOAL compiler, and are usually entered at the GOAL REPL, or as part of a macro that's executed at the GOAL REPL. These shouldn't really be used in GOAL source code. + +## `:exit` +This causes the compiler to exit after the current REPL command is over. +```lisp +(:exit) +``` +If the listener is connected, it sends a reset command to reboot the target so it is ready for the next compiler connection. + +There's a useful macro `(e)` to exit with less typing. Obviously this shouldn't be used in game code. + +## `seval` +Execute GOOS code. +```lisp +(seval form...) +``` +Evaluates the forms in the GOOS macro language. The result is not returned in any way, so it's only useful for getting side effects. It's not really used other than to bootstrap some GOAL macros for creating macros. + +## `asm-file` +Compile a file. +```lisp +(asm-file "file-name" [:color] [:write] [:load] [:no-code]) +``` +This runs the compiler on a given file. The file path is relative to the `jak-project` folder. These are the options: +- `:color`: run register allocation and code generation. Can be omitted if you don't want actually generate code. Usually you want this option. +- `:write`: write the object file to the `data` folder. You must also have `:color` on. You must do this to include this file in a DGO. +- `:load`: send the object file to the target with the listener. Requires `:color` but not `:write`. There may be issues with `:load`ing very large object files. + +To reduce typing, there are some useful macros: +- `(m "filename")` is "make" and does a `:color` and `:write`. +- `(ml "filename")` is "make and load" and does a `:color` and `:write` and `:load`. This effectively replaces the previous version of file in the currently running game with the one you just compiled, and is a super useful tool for quick debugging/iterating. +- `(build-game)` does `m` on all game files and rebuilds DGOs +- `(blg)` (build and load game) does `build-game` then sends commands to load KERNEL and GAME CGOs. The load is done through DGO loading, not `:load`ing individual object files. + +## `lt` +Listen to target. +```lisp +(lt ["ip address"] [port-number]) +``` +This causes the compiler to connect to the target/runtime. Usually it's just run as `(lt)`, as the default IP is `127.0.0.1` and the default port is the right one. If it works, you should see something like this: +``` +[Listener] Socket connected established! (took 0 tries). Waiting for version... +Got version 2.6 OK! +[OUTPUT] reset #x147d24 +``` +The `OUTPUT` message is a pending message from the runtime saying that it has reset and the location of the symbol table. + +Note: `lt` is actually a macro. Use these target control macros over the direct compiler forms (currently undocumented) whenever possible, as running the compiler forms in the wrong order can leave the target/compiler in a strange state. + +## `r` +Reset the target. +```lisp +(r) +``` +Regardless of the current state, attempt to reset the target and reconnect. + +Note: `r` is actually a macro. Use it over the (currently undocumented) compiler forms. + +## `shutdown-target` +If the target is connected, shut it down. +```lisp +(shutdown-target) +``` +The target will print +``` +GOAL Runtime Shutdown (code 2) +``` +when it shuts down. + +## `:status` +Ping the target. +```lisp +(:status) +``` +Send a ping-like message to the target. Requires the target to be connected. If successful, prints nothing. Will time-out if the GOAL kernel or code dispatched by the kernel is stuck in an infinite loop. Unlikely to be used often. + +## `gs` +Enter a GOOS REPL. +```lisp +(gs) +``` +Example: +``` +g> (gs) +goos> (+ 1 2 3) +6 +goos> (exit) +() +``` +mainly useful for debugging/trying things out in GOOS. The GOOS REPL shares its environment with the GOOS interpreter used by the compiler, so you can inspect/modify things for debugging with this. Likely not used much outside of initial debugging. + +## `set-config!` +```lisp +(set-config! config-name config-value) +``` +Used to set compiler configuration. This is mainly for debugging the compiler and enabling print statements. There is a `(db)` macro which sets all the configuration options for the compiler to print as much debugging info as possible. Not used often. + +## `in-package` +```lisp +(in-package stuff...) +``` +The compiler ignores this. GOAL files evidently start with this for some reason related to emacs. + +## `build-dgos` +```lisp +(build-dgos "path to dgos description file") +``` +Builds all the DGO files described in the DGO description file. See `goal_src/builds/dgos.txt` for an example. This just packs existing things into DGOs - you must have already built all the dependencies. + +# Compiler Forms - Control Flow + +## GOAL "Two Element" Conditions +These are `!=`, `eq?`, `neq?`, `=`, `>`, `<`, `>=`, `<=`. The default is to compare the two objects as unsigned 64-bit integers, unless a special case is hit. The special case is determined by the type of the __first__ argument: +- Floating point: if second argument is a number, convert to floating point. Use floating point comparisons +- Binteger: convert first argument to integer. If second argument is a number, convert to integer. Use signed integer comparisons +- Integer: If second argument is a number, convert to integer. Use signed integer comparison +- Unsigned Integer: If second argument is a number, convert to integer. Use unsigned integer comparison + +Note that comparing structures just checks if they refer to the same memory, not if the contents are the same. + +Currently there is absolutely no type checking done on comparisons, which makes it quite easy to get things wrong. + +When a two-element condition is used as a condition for an `if`, `cond`, `while`, `goto-when`, or any other branching condition, there is an optimization that avoids computing a GOAL boolean, then checking that GOAL boolean as a branch condition. Instead the comparison operation directly sets the x86-64 flags for a jump. Original GOAL has a similar optimization. + +There are a lot of unknown details +- What order are things evaluated / converted? +- How does the order work when there's a `not`? +- Type Checking is probably needed. +- Currently `=` and `eq?` are exactly the same. Likely `=` should only work on numbers and `eq?` should work on references? + +## `not` +```lisp +(not value) +``` +If value is `#f`, return `#t`. Otherwise return `#f`. + +Using `not` on a "two element condition" will be optimized to modifying that condition. + +## `when-goto` +```lisp +(when-goto value-or-condition destination) +``` +Examples: +```lisp +(when-goto (> x y) some-label) +(when-goto (is-player-dead?) some-label) +``` +Jump to `destination` if the condition is truthy (not `#f`). This ends up generating much better code than `(if condition (goto x))`. + +Like normal `goto`, this isn't used much outside of macros. + +## `cond` +A normal Lisp/Scheme `cond`. +```lisp +(cond (test clause...)...) +``` +Evaluates `test`s until one is truthy. Then evaluates all `clause`s in that case and returns the value of the last one. Optionally there can be a case with `else` as the test which runs if no other cases match. This must be the last case. + +If there is no `else`, and no cases match, return `#f`. (is it always `#f`?) + +The return type is the lowest common ancestor type of all cases. Note that for a `cond` without `else`, the possible return value of `#f` is __not__ considered when determining the return type. So: +```lisp +(print-type + (cond (test1 "hi") (test2 "bye")) + ) +``` +will print `[TYPE] string`, even though `cond` may return `#f`. + +This behavior seems correct if the return value is a `basic`, but less clear if the return value is supposed to be a number. + +Note that GOAL will load `#f` into a register for an else case even if the value of the `cond` is never used. Also, even if the value of the `cond` is never used, all cases will store their result into a common `cond` return-register. This is incredibly helpful for the decompiler! + +## `if` +A normal Lisp/Scheme `if`. +```lisp +(if test true-case [false-case]) +``` +The value of the entire statement is the value of the taken case. The false case can be left out. If the condition evaluates to false and the false case is left out, `#f` is returned. The return type follows the same logic as `cond`, as `if` is a macro using `cond`. + +## `when` +A normal Lisp/Scheme `when`. +```lisp +(when test forms...) +``` +If `test` is truthy, evaluate all forms and return the value of the last one. If `test` isn't true, return `#f`. + +## `unless` +A normal Lisp/Scheme `unless`. +```lisp +(unless test forms...) +``` +If `test` is false, evaluate all forms and return the value of the last one. If `test` isn't false, return `#f`. + +# Compiler Forms - Defintion + + + +## `set!` +Set a value! +```lisp +(set! place value) +``` + +Sets `place` to `value`. The `place` can be once of: +- A lexical variable defined by `let`, or an argument of a function +- A global symbol +- A `car` or `cdr` of a pair +- A field of an object +- A dereferenced pointer +- An element in an array +- A bitfield within any of the above (not yet implemented) + +## `define` +Define a global symbol +```lisp +(define symbol-name value) +``` +Kind of like `set!`, but works exclusively on global symbols. Also sets the type of the global symbol. If the global symbol already has a type, and the `define` tries to change it, there will be an error or warning. (to be determined) + +## `define-extern` +Inform the compiler about the type of a global symbol +```lisp +(define-extern symbol-name type) +``` +Useful to forward declare functions or to let the compiler know about things in the C Kernel. See `goal-externs.gc` for where all the C Kernel stuff is declared. + +# Compiler Forms - Functions + +## `defun` +Define a new named global function! +```lisp +(defun name arg-list ["doc-string"] body...) +arg-list = (arg...) +arg = (arg-name arg-type)|arg-name +``` +Example: +``` +(defun 1/ ((x float)) + "Compute 1.0 / x" + (/ 1.0 x) + ) +``` +Define a new function with the given name. Note that until the `defun` itself executes, the function __cannot be used!__. So don't call functions before the `defun`. This is unlike C, where you can forward declare a function and use it before the actual definition. + +There is an optional docstring. Currently the docstring is just thrown away but in the future we could save them and and generate documentation or something. + +## `defmethod` +Define a method! +```lisp +(defmethod method-name type-name arg-list ["doc-string"] body...) +``` +In many ways is similar to `defun`. See section on methods for more details. + +You can only `defmethod` if one of these two is true: +- You are overriding a parent method +- You have declared this method in the type's `deftype` + +Like `defun`, the method only exists after the `defmethod` executes. Before that the method may be undefined or the parent's method. + +## `inline` +Make this function call inlined. +``` +(inline function-name) +``` +Example: inline call `my-function` +``` +((inline my-funciton) my-arg) +``` +Attempts to make the function call inline. If it is not possible, it will throw an error. You can't save the value of `(inline my-function)`, only use it immediately in a function call. You must provide a name of a global function as the function, not a function pointer. + +Methods cannot be inlined. (Maybe new methods can be in original GOAL?) + +## `lambda` +Create a GOAL Lambda. +```lisp +(lambda [:name name] [:inline-only #f|#t] [:segment main|debug] arg-list body-form..) +arg-list = (arg...) +arg = (arg-name arg-type)|arg-name +``` + +The `:name` option is only used for debugging the compiler - it cannot be accessed or referenced outside of internal compiler debugging features. It should be ignored unless you are debugging the compiler. + +The `:inline-only` flag defaults to `#f`, but can be set to `#t` to force the compiler to not generate x86-64 code for the function. In this case, the lambda cannot be used as a function pointer/GOAL `function` object. This is used in the `let` macro and not really useful for general programming. If the flag is `#f` (default value), it will generate and store an x86-64 function, regardless of if the function is ever called. + +The `:segment` option defaults to `main`, unless the `lambda` is defined in a function in the `debug` segment, in which case it defaults to `debug`. It can be overridden by this flag. This picks the segment of the object file where the function will be stored. + +The arguments default to type of `object` if no type is provided. In the case where a lambda is used immediately (a `let`) the compiler will propagate more specific types. This is why you don't have to give types when using `let`. + +A GOAL lambda has three purposes: +1. Generate a function as a "real" x86-64 function. +2. Save the code so the function can later be inlined +3. Immediately use the lambda in the head of a list as part of a `let` or `let*` macro + +__Example of 1:__ +``` +(sort my-list (lambda ((x int) (y int) (< x y)))) +``` +We create a real x86-64 function to pass to the `sort` function. In this case you should specify types - the default of `object` is not suitable. + +The other two cases are handled by `let` and `defun` macros, and shouldn't show up in other places, so they are left out. + +## `declare` +Set options for a function or method +```lisp +(declare [(inline)] [(allow-inline)] [(disallow-inline)] [(asm-func)]) +``` +If used, this should be the first thing inside of a `defun`/`defmethod`. Don't use it anywhere else. +Example: +```lisp +(defun my-function () + (declare (inline)) + ... + ) +``` + +- `inline` means "inline whenever possible". See function inlining section for why inlining may be impossible in some cases. +- `allow-inline` or `disallow-inline`. You can control if inlining is allowed, though it is not clear why I thought this would be useful. Currently the default is to allow always. +- `asm-func` currently does nothing. Eventually should disable generating prologues/epilogues. Use if you want an entirely asm function. Used very rarely and probably only in the GOAL kernel. + +This form will probably get more options in the future. + +# Compiler Forms - Macro Forms + +## `#cond` +This is like an `#ifdef`, but the language for the conditions is GOOS and it's like a `cond`. +```lisp +(#cond (test clause...)...) +``` +The `#cond` is executed at compile time. The cases which don't match aren't compiled. There are `#when` and `#unless` macros that work like you would expect. + +Example: +```lisp +(#when PRINT_DEBUG_INFO + (format #t "debug info~%") + ) +``` + +## `quote` / `'` +The reader will expand `'thing` to `(quote thing)` + +```lisp +(quote thing) +``` +Currently `quote` supports: +- `'a-symbol` - will return the symbol `a-symbol` +- `'()` - will return the empty list. + +In the future, it should support quoted lists of static data. + +## `defglobalconstant` +Define a GOOS and GOAL constant. +```lisp +(defconstant name value) +``` + +The constant is available in both GOOS and GOAL. You can use it in `#cond` expressions (GOOS) and in GOAL code. The constant inserts the `value` as an s-expression in the code. This means it's a "code" constant, and doesn't have a type. + +There are a few restrictions: +- Currently constants do not work in `deftype`. (this should be fixed eventually) +- Constants may not work in places where the compiler is expecting a symbol which isn't actually compiled. So `(+ MY_CONSTANT 2)` is fine, but `(defun MY_CONSANT () ...)` isn't. Don't use constants for type names, function names, or symbol names. It is fine to have a constant with a value of a symbol, but don't `(define MY_CONSTANT)` or `(set! MY_CONSTANT)` or `(new MY_CONSTANT)` or things like that. +- Don't use constants with `method` form. +- You can modify constants created with `defglobalconstant` in GOOS (effect won't be seen in GOAL) with `(set!)` +- There is no warning if one `defglobalconstant` changes the value of an exisiting `defglobalconstant` + +In general constants should have `UPPERCASE` names otherwise things get very confusing when there are name conflicts. + +The recommendation is to use constants for things like numbers or expressions like `(* NUM_THINGS SIZE_OF_EACH_THING)`. + +## `mlet` +Scoped constants in GOAL. Syntax is like a `let`. This feature has all the restrictions of `defglobalconstant`. +Avoid using `mlet` becuase it's confusing and not useful. +```lisp +(mlet ((constant-name constant-value)...) + body... + ) +``` + +Example: +```lisp +(mlet ((NUM-THINGS 12) + (THING-NAME "test")) + ; in here, NUM-THING and THING-NAME are constants + ) +``` + +# Compiler Forms - Math Forms + +Math forms will look at the type of the first argument to determine the "mode". So if you have `(+ 1 1.2)`, it will convert the `1.2` to an integer, do the add, and return an integer. + +## `+` +Addition. Can take 1 or more arguments. `(+ 1)` will give you `1`, like you'd expect. +```lisp +(+ form...) +``` +Works on integers and floats. Integer add is 64-bit and wrapping. + +## `-` +Subtraction or negative. Can take 1 or more arguments. +```lisp +(- form...) +``` +`(- 1)` gives you `-1`, but `(- 1 3)` gives you `-2`, which may be slightly confusing at first. Works on integers and floats. Integer subtract is 64-bit and wrapping. + +## `*` +Multiplication. Can take 1 or more arguments. +```lisp +(* form...) +``` +`(* 7)` will become `7`, as you'd expect. Works on integers and floats. The exact behavior for integers needs to be explored more because the EE is weird. GOAL generates different code for multiplication of signed vs. unsigned integers. + +## `/` +Division. Takes exactly two arguments +```lisp +(/ dividend divisor) +``` +Works on floats and integers. The exact behavior for integers needs to be explored more because the EE is weird. GOAL generates different code for division of signed vs. unsigned integers. + +## `mod` +Modulo operation. Takes exactly two arguments. +```lisp +(/ dividend divisor) +``` +Works on integers only. The exact behavior needs to be explored because the EE is weird. It is unknown if the same code is generate for signed/unsigned mod. + +## `slhv`, `sarv`, `shrv` +```lisp +(shlv value shift-amount) +``` +The exact behavior of GOAL shifts isn't fully understood, so these are temporary wrappers around x86-64 variable shift instructions. +- `shlv` shift left variable +- `sarv` shift arithmetic right variable +- `shrv` shift logical right variable +64-bit operation. + +## `logand` +Bitwise And +```lisp +(logand a b) +``` +64-bit operation. + +## `logior` +Bitwise Inclusive Or (normal Or) +```lisp +(logior a b) +``` +64-bit operation. + +## `logxor` +Bitwise Exclusive Or (Xor +```lisp +(logxor a b) +``` +64-bit operation. + +## `lognot` +Bitwise Not +```lisp +(lognot a) +``` +64-bit operation. + +# Compiler Forms - Type Forms + +## `defmethod` + +## `deftype` + + +## `method` +Get a method of a type or an object. +__Warning - I will probably change this in the future.__ +``` +(method type method-name) +(method object method-name) +``` + +The first form of this takes a type name and method name and returns a GOAL `function` for this method. For example: +``` +(method string inspect) +``` +will return the `inspect` method of `string`. + +The second form of this takes an object and gets the method from it. If the object has runtime type information, will consult the method table to get a possibly more specific method than what is available at compile time. This uses the same lookup logic as method calling - see the section on method calls for more information. + +## `car` and `cdr` +Get element from pair +```lisp +(car some-pair) +(cdr some-pair) +``` + +The type of the result is always `object`, as pairs can hold any `object`. The type-check for `car` and `cdr` is relaxed - it allows it to be applied to any `pair` or `object`. The reason for allowing `object` is so you can write `(car (car x))` instead of `(car (the pair (car x)))`. However, if the argument to `car` is not a `pair`, you will get garbage or a crash. + +## `new` +See section on creating new GOAL objects + +## `print-type` +Print the type of some GOAL expression at compile time. +```lisp +(print-type form) +``` +This is mainly used to debug the compiler or figure out why some code is failing a type check. The thing inside is actually executed at runtime. Example: +```lisp +(print-type "apples") ;; [TYPE] string +(print-type (+ 12 1.2)) ;; [TYPE] int +(print-type (the float 12)) ;; [TYPE] float +``` + +## `the` +Convert between types, doing the expected thing for number conversions. +```lisp +(the type thing) +``` + +If the `type` and the `thing` are both numbers, it will automatically convert between the different numeric types as needed. In all other cases, it does a dangerous `reinterpret_cast`. cppreference.com explains this idea clearly with "Converts between types by reinterpreting the underlying bit pattern." + +If the `thing` is a number: +- If `type` is `binteger`, convert the number to a `binteger` +- If `type` is `int` or `uint` (or some user-defined child type of these), convert the number to an integer. +- If `type` is `float`, conver the number to a `float` + +In all other cases, directly use the 64-bit value in the reigster as the value of the desired `type`. + + +Example of number conversions: +``` +(the binteger 12) ;; boxed integer for 12 +(the float 1) ;; floating point 1.0 +(the int 1.234) ;; signed integer 1 +``` + +Examples of common casts: +``` +(the uint 1) ;; unsigned integer, doesn't do any modification if input is already an int. +(the (pointer uint8) x) ;; like C (uint8_t*)x +(the string (car x)) ;; if you know (car x) is a string, do this. +``` + +Examples of dangerous things you can do but probably shouldn't: +``` +(the string 1.234) ;; take the binary representation of 1.234 and treat it as a GOAL memory address to string data. +(the float 'bean) ;; take the GOAL memory address of the "bean" symbol and treat it as the binary representation of a float. +``` + +There are some weird edge cases with `the` that are worth mentioning, if you try to set the value of something you've used `the` on. In the future the compiler should block you from doing something bad, but this is not yet implemented. + +``` +(set! (-> (the (pointer uint8) x)) 1) ;; OK, not casting the actual value +(set! (the int (-> obj x)) 1) ;; NOT OK. Int is a value type +;; Will actually work if x is already an int/uint, and with non-numeric values types like pointer. Avoid just to be safe. +(set! (the string (-> obj x)) "test") ;; OK, string is a basic, which is a reference type. +``` + +This becomes more clear if we look at the C equivalent: +``` +*(uint8_t*)(a->x) = 1; // makes sense + +(int)(a->x) = 1; // doesn't make sense + +*(thing*)(a->x) = thing(); // makes sense +``` + + +## `the-as` +Convert between types always using `reinterpret_cast` +```lisp +(the-as type thing) +``` +cppreference.com explains this idea clearly with "Converts between types by reinterpreting the underlying bit pattern." + +The recommendation is to prefer `the` in almost all cases, unless you want to set an exact bit pattern of a `float`, or want to examine the bits in a `float`. + +Example: +``` +(the-as int 1.234) ;; result happens to be 1067316150 +``` + +None of the edge cases of `the` apply to `the-as`. + + +## Pointer Math +Not implemented well yet. + +# Compiler Forms - Unsorted + +## `let` +```lisp +(let ((var-name value)...) body...) +``` +Define local variables. The variables are automatically assigned a type, like C++ `auto`. + +Example: +```lisp +(let ((count-1 (+ a b)) ;; count_1 = a + b + (count-2 (+ c d))) ;; count_2 = c + d + (if (count > 10) + ;; print a message if count > 10. + (format #t "count = ~D, ~D~%" count-1 count-2) + ) + ) +``` + +Note, if you define multiple variables in a `let`, you cannot refer to variables defined previously in the same `let`. In the example above, `count-2`'s value couldn't be defined in terms of `count-1` for example. See `let*`. + +## `let*` +```lisp +(let ((var-name value)...) body...) +``` + +Define local variables. If you define multiple in a single `let*`, you can refer to previous variables. + +Example: +```lisp +(let* ((count-1 (+ a b)) + (count-2 (+ count-1 d))) ;; okay because we used let* + (if (count > 10) + ;; print a message if count > 10. + (format #t "count = ~D, ~D~%" count-1 count-2) + ) + ) +``` + +## Things related to enums +Not yet implemented + +## `defmacro` + +## Loop forms + +## `&` + +## `->` + +## Type + +## Compile-Time Size stuff + +## `object-new` + + +# Compiler Features + +## Compiling a list +When the compiler encounters a list like `(a b c)` it attempts to parse in multiple ways in this order: +1. A compiler form +2. A GOOS macro +3. An enum (not yet implemented) +4. A function or method call + +## Compiling an integer +Integers can be specified as +- decimal: `1` or `-1234` (range of `INT64_MIN` to `INT64_MAX`) +- hex: `#x123`, `#xbeef` (range of `0` to `UINT64_MAX`) +- binary: `#b101010` (range of `0` to `UINT64_MAX`) + +All integers are converted to the signed "integer in variable" type called `int`, regardless of how they are specified. +Integer "constant"s are not stored in memory but instead are generated by code, so there's no way to modify them. + +## Compiling a string +A string constant can be specified by just putting it in quotes. Like `"this is a string constant"`. +There is an escape code `\` for string: +- `\n` newline +- `\t` tab character +- `\\` the `\` character +- `\"` the `"` character +- Any other character following a `\` is an error. + +OpenGOAL stores strings in the same segment of the function which uses the string. I believe GOAL does the same. + +In GOAL, string constants are pooled per object file (or perhaps per segment)- if the same string appears twice, it is only included once. OpenGOAL currently does not pool strings. If any code is found that modifies a string "constant", or if repeated strings take up too much memory, string pooling will be added. + +For now I will assume that string constants are never modified. + + +## Compiling a float +A floating point constant is distinguished from an integer by a decimal point. Leading/trailing zeros are optional. Examples of floats: `1.0, 1., .1, -.1, -0.2`. Floats are stored in memory, so it may be possible to modify a float constant. For now I will assume that float constants are never modified. It is unknown if they are pooled like strings. + +Trivia: Jak 2 realized that it's faster to store floats inline in the code. + +## Compiling a symbol +A `symbol` appearing in code is compiled by trying each of these in the following order +1. Is it `none`? (see section on `none`) +2. Try `mlet` symbols +3. Try "lexical" variables (defined in `let`) +4. Try global constants +5. Try global variables (includes named functions and all types) + +## The Special `none` type +Anything which doesn't return anything has a return type of `none`, indicating the return value can't be used. This is similar to C's `void`. + +## GOAL Structs vs. C Structs +There is one significant difference between C and GOAL when it comes to structs/classes - GOAL variables can only be references to structs. + +As an example, consider a GOAL type `my-type` and a C type `my_type`. In C/C++, a variable of type `my_type` represents an entire copy of a `my_type` object, and a `my_type*` is like a reference to an existing `my_type` object. In GOAL, an object of `my-type` is a reference to an existing `my-type` object, like a C `my_type*`. There is no equivalent to a C/C++ `my_type`. + +As a result you cannot pass or return a structure by value. + +Another way to explain this is that GOAL structures (including `pair`) always have reference semantics. All other GOAL types have value semantics. + +## Pointers +GOAL pointers work a lot like C/C++ pointers, but have some slight differences: +- A C `int32_t*` is a GOAL `(pointer int32)` +- A C `void*` is a GOAL `pointer` +- In C, if `x` is a `int32_t*`, `x + 1` is equivalent to `uintptr_t(x) + sizeof(int32_t)`. In GOAL, all pointer math is done in units of bytes. +- In C, you can't do pointer math on a `void*`. In GOAL you can, and all math is done in units of bytes. + +In both C and GOAL, there is a connection between arrays and pointers. A GOAL array field will have a pointer-to-element type, and a pointer can be accessed as an array. + +One confusing thing is that a `(pointer int32)` is a C `int32_t*`, but a `(pointer my-structure-type)` is a C `my_structure_type**`, becuase a GOAL `my-structure-type` is like a C `my_structure_type*`. + +## Inline Arrays +One limitation of the system above is that an array of `my_structure_type` is actually an array of references to structures (C `object*[]`). It would be more efficient if instead we had an array of structures, laid out together in memory (C `object[]`). + +GOAL has a "inline array" to represent this. A GOAL `(inline-array thing)` is like a C `thing[]`. The inline-array can only be used on structure types, as these are the only reference types. + + +## Fields in Structs +For a field with a reference type (structure/basic) +- `(data thing)` is like C `Thing* data;` +- `(data thing :inline #t)` is like C `Thing data;` +- `(data thing 12)` is like C `Thing* data[12];`. The field has `(pointer thing)` type. +- `(data thing 12 :inline #t)` is like `Thing data[12];`. The field has `(inline-array thing)` type + +For a field with a value type (integer, etc) +- `(data int32)` is like C `int32_t data;` +- `(data int32 12)` is like `int32_t data[12];`. The field has `(array int32)` type. + +Using the `:inline #t` option on a value type is not allowed. + +## Dynamic Structs +GOAL structure can be dynamically sized, which means their size isn't determined at compile time. Instead the user should implement `asize-of` to return the actual size. + +This works by having the structure end in an array of unknown size at compile time. In a dynamic structure definition, the last field of the struct should be an array with an unspecified size. To create this, add a `:dynamic #t` option to the field and do not specify an array size. This can be an array of value types, an array of reference types, or an inline-array of reference types. + +### Unknown +Is the `size` of a dynamic struct: +- size assuming the dynamic array has 0 elements (I think it's this) +- size assuming the dynamic array doesn't + +These can differ by padding for alignment. + + +## Methods + +## Method `_type_` type + +## Calling Methods + +## Built-in Methods + +## New - How To Create GOAL Objects + +## Defining a `new` Method + +## Integer Type +GOAL has some weird behavior when it comes to integers. It may seem complicated to describe, but it really makes the implementation simpler - the integer types are designed around the available MIPS instructions. + +Integers that are used as local variables (defined with `let`), function arguments, function return values, and intermediate values when combining these are called "register integers", as the values will be stored in CPU registers. + +Integers that are stored in memory as a field of a `structure`/`basic`, an element in an array, or accessed through a `pointer` are "memory integers", as the values will need to be loaded/stored from memory to access them. + +The "register integer" types are `int` and `uint`. They are 64-bit and mostly work exactly like you'd expect. Multiplication, division, and mod, are a little weird and are documented separately. + +The "memory integer" types are `int8`, `int16`, `int32`, `int64`, `uint8`, `uint16`, `uint32`, and `uint64`. + +Conversions between these types are completely automatic - as soon as you access a "memory integer", it will be converted to a "register integer", and trying to store a "register integer" will automatically convert it to the appropriate "memory integer". It (should be) impossible to accidentally get this wrong. + +### Side Note +- It's not clear what types `(new 'static 'integer)` or `(new 'stack 'integer)` are, though I would assume both are memory. + +- If there aren't enough hardware registers, "register integers" can be spilled to stack, but keep their "register integer" types. This process should be impossible to notice, so you don't have to worry about it. + +## Array Spacing +In general, all GOAL objects are 16-byte aligned and the boxing system requires this. All heap memory allocations are 16-byte aligned too, so this is usually not an issue. + +## Truth +Everything is true except for `#f`. This means `0` is true, and `'()` is true. +The value of `#f` can be used like `nullptr`, at least for any `basic` object. It's unclear if `#f` can/should be used as a null for other types, including `structure`s or numbers or pointers. + +Technical note: the hex number `0x147d24` is considered false in Jak 1 NTSC due to where the symbol table happened to be allocated. However, checking numbers for true/false shouldn't be done, you should use `(zero? x)` instead. + +## Empty Pair + +# Built-in Types + +## `structure` +A structure is the parent type of all types with fields. + +## `basic` +A basic is a structure with runtime type information. The first field is named `type` and contains the `type` of the basic. + +# Implemented in Runtime Language Functions + +## `string->symbol` + +## `symbol->string` + +## `format` +GOAL's `printf`. +```lisp +(format destination format-string args...) +``` + +The following destinations are currently supported: +- `#t` - print to the listener. After the current game frame is over, this will be sent to the compiler and you can see it at the GOAL prompt. +- `0` - print to `stdout` in the runtime immediately. This won't be visible from within the compiler - you must look at the runtime to see it. This is useful for debugging if the runtime crashes before flushing the normal print buffer. +- `#f` - print to a new string allocated on the global heap. +- a GOAL `string` object - append to an existing string +- a GOAL `file-stream` object - currently unsupported but eventually may allow printing into a file somewhere + +The global variable `*print-column*` can be used to automatically print at a certain indentation. The very first thing printed during a frame will not have the indentation applied. + +The format string excape sequences all start with `~`, then have arguments (possibly none), then have a single character code. The arguments look like: +- `~A`, the `A` code with no arguments +- `~12A`, the `A` code with an integer argument of `12` +- `~'zA`, the `A` code with a character argument of `z` +- ``` ~`hello`A```, the `A` code with a string argument of `"hello"` +- `~12,'bA`, the `A` code with two arguments, integer `12` and character `b` + + +The escape codes are + +### `~%` +Replace with a newline character. + +### `~~` +Replace with a `~` character + +### `~G` or `~g` +Replace with a C-style string given in `args`. Note that this will not work on a GOAL string. + +### `~A` or `~a` +Print a boxed object given in `args`. Uses the `print` method. Can take optional arguments for length and padding character. If the `print` method gives something shorter than the length argument, it will be padded on the left with the padding character (default is space). If the `print` method gives something too long, it will be truncated on the right. The last character printed will be changed to `~` to indicate it was truncated here. + +There is an option to left justify instead but I don't think there's a way to turn it on. + +### `~S` or `~s` +Very similar to `~A`, but a GOAL string will be printed without quotes around it. + +### `~C` or `~c` +Print a single character (GOAL `uint8` or `int8` type) + +### `~P` or `~p` +Print an object, similar to `~A`, but does not have optional arguments for length or padding. Instead, there is an optional argument to give a type name, then use that types `print` method. This is useful for printing non-boxed objects. If no type name is given, behaves like `~A`. + +### `~I` or `~i` +Like `~P`, but uses the inspect method instead. + +### `~Q` or `~q` +Likely was supposed to be for printing 128-bit integers stored in registers, but will always prints `0`. The `format` function is written in C using varargs, which doesn't support 128-bit register values. + +### `~B` or `~b` +Print integer as binary. Optional arguments for pad-length and pad-character (default is 0). Won't truncate. + +### `~D` or `~d` +Print integer as decimal (signed). Optional arguments for pad-length and pad-character (default is space). Won't truncate. + +### `~X` or `~x` +Print integer as hex. Optional arguments for pad-length and pad-character (default is 0). Won't truncate. + +### `~F` +Print floating point. Will print 4 digits after the decimal and pad with space to a width of 12 and does not accept any options. + +### `~f` +Print floating point. Takes optional arguments for pad-length (default don't pad), pad-character (default space), and precision (default 4). + +## `~R` or `~r` +Like `~f` but scales in-game rotation units to degrees. The float `65536.0` is 360 degrees. + +### `~M` or `~m` +Like `~f` but scales in-game distance units to meters. The float `4096.0` is 1 meter. + +### `~E` or `~e` +Like `~f` for argument, but takes an integer time-code as an input and scales time-code units to seconds. There are 300 ticks / second, which is the smallest number which has an integer number of ticks per NTSC and PAL frame. Something very weird happens when the input is negative? + +### `~T` or `~t` +Insert a tab character. + +### Pass Through Codes +Some codes will be passed through automatically, along with any arguments. This will also pass through arguments of `+` or `-`. I believe that these options could later be interpreted by the code for printing on-screen characters. + +The pass through codes are `H,J,K,L,N,V,W,Y,Z,h,j,k,l,n,v,w,y,z`. + +Any other codes will result in an error message being printed. + + + +## Load Stuff \ No newline at end of file diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt index 6ded6b6508..d8aeb06f32 100644 --- a/game/CMakeLists.txt +++ b/game/CMakeLists.txt @@ -70,16 +70,24 @@ set(RUNTIME_SOURCE overlord/stream.cpp) # the runtime should be built without any static/dynamic libraries. -add_executable(gk ${RUNTIME_SOURCE} main.cpp) +#add_executable(gk ${RUNTIME_SOURCE} main.cpp) + # we also build a runtime library for testing. This version is likely unable to call GOAL code correctly, but # can be used to test other things. add_library(runtime ${RUNTIME_SOURCE}) +add_executable(gk main.cpp) + IF (WIN32) # set stuff for windows - target_link_libraries(gk cross_sockets mman common_util) + target_link_libraries(runtime mman cross_sockets common_util) + target_link_libraries(gk cross_sockets mman common_util runtime) ELSE() # set stuff for other systems - target_link_libraries(gk cross_sockets pthread common_util) + target_link_libraries(runtime pthread cross_sockets common_util) + target_link_libraries(gk cross_sockets pthread common_util runtime) + ENDIF() + + diff --git a/game/kernel/kboot.cpp b/game/kernel/kboot.cpp index d33fe4738a..ace3785582 100644 --- a/game/kernel/kboot.cpp +++ b/game/kernel/kboot.cpp @@ -47,12 +47,15 @@ u32 DebugSegment; // Set to 1 to load game engine after boot automatically u32 DiskBoot; +u32 MasterUseKernel; + void kboot_init_globals() { strcpy(DebugBootLevel, "#f"); // no specified level strcpy(DebugBootMessage, "play"); // play mode, the default retail mode MasterExit = 0; MasterDebug = 1; + MasterUseKernel = 1; DebugSegment = 1; DiskBoot = 0; memset(&masterConfig, 0, sizeof(MasterConfig)); @@ -117,6 +120,9 @@ s32 goal_main(int argc, const char* const* argv) { if (InitMachine() >= 0) { // init kernel KernelCheckAndDispatch(); // run kernel ShutdownMachine(); // kernel died, we should too. + } else { + fprintf(stderr, "InitMachine failed\n"); + exit(1); } return 0; @@ -143,15 +149,15 @@ void KernelCheckAndDispatch() { call_goal(Ptr(kernel_dispatcher->value), 0, 0, 0, s7.offset, g_ee_main_mem); } else { if (ListenerFunction->value != s7.offset) { - fprintf(stderr, "Running Listener Function:\n"); - auto cptr = Ptr(ListenerFunction->value).c(); - for (int i = 0; i < 40; i++) { - fprintf(stderr, "%x ", cptr[i]); - } - fprintf(stderr, "\n"); + // fprintf(stderr, "Running Listener Function:\n"); + // auto cptr = Ptr(ListenerFunction->value).c(); + // for (int i = 0; i < 40; i++) { + // fprintf(stderr, "%x ", cptr[i]); + // } + // fprintf(stderr, "\n"); auto result = call_goal(Ptr(ListenerFunction->value), 0, 0, 0, s7.offset, g_ee_main_mem); - fprintf(stderr, "result of listener function: %lld\n", result); +// fprintf(stderr, "result of listener function: %lld\n", result); #ifdef __linux__ cprintf("%ld\n", result); #else diff --git a/game/kernel/kboot.h b/game/kernel/kboot.h index e9ac165d55..8b08905246 100644 --- a/game/kernel/kboot.h +++ b/game/kernel/kboot.h @@ -75,6 +75,6 @@ void KernelCheckAndDispatch(); */ void KernelShutdown(); -constexpr bool MasterUseKernel = false; +extern u32 MasterUseKernel; #endif // RUNTIME_KBOOT_H diff --git a/game/kernel/klink.cpp b/game/kernel/klink.cpp index 5978131404..1014f7ed3d 100644 --- a/game/kernel/klink.cpp +++ b/game/kernel/klink.cpp @@ -8,6 +8,7 @@ #include #include +#include #include "klink.h" #include "fileio.h" #include "kscheme.h" @@ -67,6 +68,14 @@ void link_control::begin(Ptr object_file, m_segment_process = 0; ObjectFileHeader* ofh = m_link_block_ptr.cast().c(); + if (ofh->goal_version_major != versions::GOAL_VERSION_MAJOR) { + fprintf( + stderr, + "VERSION ERROR: C Kernel built from GOAL %d.%d, but object file %s is from GOAL %d.%d\n", + versions::GOAL_VERSION_MAJOR, versions::GOAL_VERSION_MINOR, name, ofh->goal_version_major, + ofh->goal_version_minor); + exit(0); + } if (link_debug_printfs) { printf("Object file header:\n"); printf(" GOAL ver %d.%d obj %d len %d\n", ofh->goal_version_major, ofh->goal_version_minor, diff --git a/game/kernel/klisten.cpp b/game/kernel/klisten.cpp index 22f9aad10b..322d049e33 100644 --- a/game/kernel/klisten.cpp +++ b/game/kernel/klisten.cpp @@ -149,7 +149,6 @@ void ProcessListenerMessage(Ptr msg) { // this setup allows listener function execution to clean up after itself. ListenerFunction->value = link_and_exec(buffer, "*listener*", 0, kdebugheap, LINK_FLAG_FORCE_DEBUG).offset; - fprintf(stderr, "ListenerFunction is now 0x%x\n", ListenerFunction->value); return; // don't ack yet, this will happen after the function runs. } break; default: diff --git a/game/kernel/kmachine.cpp b/game/kernel/kmachine.cpp index f5b611b364..20161fd686 100644 --- a/game/kernel/kmachine.cpp +++ b/game/kernel/kmachine.cpp @@ -94,6 +94,12 @@ void InitParms(int argc, const char* const* argv) { reboot = 0; } + // an added mode to allow booting without a KERNEL.CGO for testing + if (arg == "-nokernel") { + Msg(6, "dkernel: no kernel mode\n"); + MasterUseKernel = false; + } + // GOAL Settings // ---------------------------- diff --git a/game/kernel/kscheme.cpp b/game/kernel/kscheme.cpp index 614544af5b..e5b7fda32b 100644 --- a/game/kernel/kscheme.cpp +++ b/game/kernel/kscheme.cpp @@ -361,22 +361,26 @@ Ptr make_function_from_c_win32(void* func) { } /* - * push rdi - * push rsi - * push rdx - * push rcx - * pop r9 - * pop r8 - * pop rdx - * pop rcx - * - * sub rsp, 40 - * call rax - * add rsp, 40 - * ret +push rdi +push rsi +push rdx +push rcx +pop r9 +pop r8 +pop rdx +pop rcx +push r10 +push r11 +sub rsp, 40 +call rax +add rsp, 40 +pop r11 +pop r10 +ret */ - for (auto x : {0x57, 0x56, 0x52, 0x51, 0x41, 0x59, 0x41, 0x58, 0x5A, 0x59, 0x48, - 0x83, 0xEC, 0x28, 0xFF, 0xD0, 0x48, 0x83, 0xC4, 0x28, 0xC3}) { + for (auto x : + {0x57, 0x56, 0x52, 0x51, 0x41, 0x59, 0x41, 0x58, 0x5A, 0x59, 0x41, 0x52, 0x41, 0x53, 0x48, + 0x83, 0xEC, 0x28, 0xFF, 0xD0, 0x48, 0x83, 0xC4, 0x28, 0x41, 0x5B, 0x41, 0x5A, 0xC3}) { mem.c()[i++] = x; } @@ -883,8 +887,6 @@ u64 method_set(u32 type_, u32 method_id, u32 method) { if (method_id > 127) printf("[METHOD SET ERROR] tried to set method %d\n", method_id); - // printf("METHOD SET id %d to 0x%x type 0x%x!\n", method_id, method, type_); - auto existing_method = type->get_method(method_id).offset; if (method == 1) { @@ -1089,7 +1091,7 @@ u64 sprint(u32 obj) { */ u64 print_object(u32 obj) { if ((obj & OFFSET_MASK) == BINTEGER_OFFSET) { - return print_binteger(obj); + return print_binteger(s64(s32(obj))); } else { if ((obj < SymbolTable2.offset || 0x7ffffff < obj) && // not in normal memory (obj < 0x84000 || 0x100000 <= obj)) { // not in kernel memory diff --git a/game/runtime.cpp b/game/runtime.cpp index bb0c7b84dc..a86cb0c134 100644 --- a/game/runtime.cpp +++ b/game/runtime.cpp @@ -49,6 +49,9 @@ u8* g_ee_main_mem = nullptr; namespace { +int g_argc = 0; +char** g_argv = nullptr; + /*! * SystemThread function for running the DECI2 communication with the GOAL compiler. */ @@ -98,10 +101,6 @@ constexpr u64 EE_MAIN_MEM_MAP = 0x2000000000; // intentionally > 32-bit to // so this should be used only for debugging. constexpr bool EE_MEM_LOW_MAP = false; -// GOAL Boot arguments -constexpr const char* GOAL_ARGV[] = {"", "-fakeiso", "-boot", "-debug"}; -constexpr int GOAL_ARGC = 4; - /*! * SystemThread Function for the EE (PS2 Main CPU) */ @@ -132,6 +131,11 @@ void ee_runner(SystemThreadInterface& iface) { printf("[EE] Run!\n"); memset((void*)g_ee_main_mem, 0, EE_MAIN_MEM_SIZE); + + // prevent access to the first 1 MB of memory. + // On the PS2 this is the kernel and can't be accessed either. + // this may not work well on systems with a page size > 1 MB. + mprotect((void*)g_ee_main_mem, 1024 * 1024, PROT_NONE); fileio_init_globals(); kboot_init_globals(); kdgo_init_globals(); @@ -146,7 +150,7 @@ void ee_runner(SystemThreadInterface& iface) { kmemcard_init_globals(); kprint_init_globals(); - goal_main(GOAL_ARGC, GOAL_ARGV); + goal_main(g_argc, g_argv); printf("[EE] Done!\n"); // // kill the IOP todo @@ -224,8 +228,8 @@ void iop_runner(SystemThreadInterface& iface) { * Arguments are currently ignored. */ u32 exec_runtime(int argc, char** argv) { - (void)argc; - (void)argv; + g_argc = argc; + g_argv = argv; // step 1: sce library prep iop::LIBRARY_INIT(); diff --git a/game/system/Deci2Server.cpp b/game/system/Deci2Server.cpp index f3e2f09b61..665beb467f 100644 --- a/game/system/Deci2Server.cpp +++ b/game/system/Deci2Server.cpp @@ -194,8 +194,8 @@ void Deci2Server::run() { } auto* hdr = (Deci2Header*)(buffer); - fprintf(stderr, "[DECI2] Got message:\n"); - fprintf(stderr, " %d %d 0x%x %c -> %c\n", hdr->len, hdr->rsvd, hdr->proto, hdr->src, hdr->dst); + fprintf(stderr, "[DECI2] Got message: %d %d 0x%x %c -> %c\n", hdr->len, hdr->rsvd, hdr->proto, + hdr->src, hdr->dst); hdr->rsvd = got; diff --git a/game/system/iop_thread.cpp b/game/system/iop_thread.cpp index 67998ab879..cb8c22a6b0 100644 --- a/game/system/iop_thread.cpp +++ b/game/system/iop_thread.cpp @@ -91,6 +91,9 @@ void IOP::kill_from_ee() { void IOP::signal_run_iop() { std::unique_lock lk(iters_mutex); iop_iters_des += 100; // todo, tune this + if (iop_iters_des - iop_iters_act > 500) { + iop_iters_des = iop_iters_act + 500; + } iop_run_cv.notify_all(); } diff --git a/gk.sh b/gk.sh index d103729b8f..e80d3fb5f4 100755 --- a/gk.sh +++ b/gk.sh @@ -3,4 +3,4 @@ # Directory of this script DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -$DIR/build/game/gk "$@" +$DIR/build/game/gk -fakeiso -debug -nokernel diff --git a/goal_src/goal-lib.gc b/goal_src/goal-lib.gc index 89cb46f6fd..9003837d4a 100644 --- a/goal_src/goal-lib.gc +++ b/goal_src/goal-lib.gc @@ -92,6 +92,12 @@ ) ) +(defmacro shutdown-target () + `(begin + (reset-target :shutdown) + ) + ) + ;;;;;;;;;;;;;;;;;;; ;; GOAL Syntax @@ -138,6 +144,26 @@ ) ) +(defmacro until (test &rest body) + (with-gensyms (reloop) + `(begin + (label ,reloop) + ,@body + (when-goto (not ,test) ,reloop) + ) + ) + ) + +(defmacro dotimes (var &rest body) + `(let (( ,(first var) 0)) + (while (< ,(first var) ,(second var)) + ,@body + (+1! ,(first var)) + ) + ,@(cddr var) + ) + ) + ;; Backup some values, and restore after executing body. ;; Non-dynamic (nonlocal jumps out of body will skip restore) (defmacro protect (defs &rest body) @@ -165,8 +191,11 @@ `(set! ,place (+ ,place ,amount)) ) -;; todo, handle too many arguments correct (defmacro if (condition true-case &rest others) + (if (> (length others) 1) + (error "got too many arguments to if") + #f + ) (if (null? others) `(cond (,condition ,true-case)) `(cond (,condition ,true-case) @@ -175,6 +204,62 @@ ) ) +(defmacro when (condition &rest body) + `(if ,condition + (begin ,@body) + ) + ) + +(defmacro unless (condition &rest body) + `(if (not ,condition) + (begin ,@body) + ) + ) + +;; TODO - these work but aren't very efficient. + +(defmacro and (&rest args) + (with-gensyms (result end) + `(begin + (let ((,result (the object #f))) + ,@(apply (lambda (x) + `(begin + (set! ,result ,x) + (if (eq? ,result #f) + (goto ,end) + ) + ) + ) + args + ) + (label ,end) + ,result + ) + ) + ) + ) + +(defmacro or (&rest args) + (with-gensyms (result end) + `(begin + (let ((,result (the object #f))) + ,@(apply (lambda (x) + `(begin + (set! ,result ,x) + (if (not (eq? ,result #f)) + (goto ,end) + ) + ) + ) + args + ) + (label ,end) + ,result + ) + ) + ) + ) + ;;;;;;;;;;;;;;;;;;; ;; Math Macros ;;;;;;;;;;;;;;;;;;; @@ -201,4 +286,120 @@ (defmacro 1- (var) `(- ,var 1) + ) + +(defmacro zero? (thing) + `(eq? ,thing 0) + ) + +(defmacro &+! (val amount) + `(set! ,val (&+ ,val ,amount)) + ) + +(defmacro &- (a b) + `(- (the-as uint ,a) (the-as uint ,b)) + ) + +(defmacro &-> (&rest args) + `(& (-> ,@args)) + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Bit Macros +;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defmacro align16 (value) + `(logand #xfffffff0 (+ (the-as integer ,value) 15)) + ) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TYPE STUFF +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmacro basic? (obj) + ;; todo, make this more efficient + `(= 4 (logand (the integer ,obj) #b111)) + ) + +(defmacro pair? (obj) + ;; todo, make this more efficient + `(= 2 (logand (the integer ,obj) #b111)) + ) + +(defmacro binteger? (obj) + `(zero? (logand (the integer ,obj) #b111)) + ) + +(defmacro rtype-of (obj) + `(cond ((binteger? ,obj) binteger) + ((pair? ,obj) pair) + (else (-> (the basic ,obj) type)) + ) + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; PAIR STUFF +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defmacro cons (a b) + `(new 'global 'pair ,a ,b) + ) + +(defmacro list (&rest args) + (if (null? args) + (quote '()) + `(cons ,(car args) (list ,@(cdr args))) + ) + ) + +(defmacro null? (arg) + ;; todo, make this better + `(eq? ,arg '()) + ) +(defmacro caar (arg) + `(car (car ,arg)) + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; METHOD STUFF +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(defmacro object-new (&rest sz) + (if (null? sz) + `(the ,(current-method-type) ((method object new) allocation type-to-make (the int (-> type-to-make size)))) + `(the ,(current-method-type)((method object new) allocation type-to-make ,@sz)) + ) + ) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; TEST STUFF +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmacro expect-eq (a b &key (name "unknown")) + `(if (!= ,a ,b) + (format #t "Test Failed On Test ~D: ~A~%" *test-count* ,name) + (+! *test-count* 1) + ) + ) + +(defmacro expect-true (a) + `(expect-eq ,a #t) + ) + +(defmacro expect-false (a) + `(expect-eq ,a #f) + ) + +(defmacro start-test (test-name) + `(begin + (define *test-name* ,test-name) + (define *test-count* 0) + ) + ) + +(defmacro finish-test () + `(format #t "Test ~A: ~D Passes~%" *test-name* *test-count*) ) \ No newline at end of file diff --git a/goal_src/kernel-defs.gc b/goal_src/kernel-defs.gc index 862d2c7ff9..9a182a9a9b 100644 --- a/goal_src/kernel-defs.gc +++ b/goal_src/kernel-defs.gc @@ -71,7 +71,7 @@ (define-extern load (function string kheap object)) (define-extern loado (function string kheap object)) (define-extern unload (function string none)) -(define-extern _format function) +(define-extern _format (function _varargs_ object)) (define-extern malloc (function kheap int pointer)) (define-extern kmalloc (function kheap int int string)) (define-extern new-dynamic-structure (function kheap type int structure)) @@ -101,7 +101,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; *listener-link-block* -;; *listener-function* +(define-extern *listener-function* (function object)) ;; kernel-dispatcher ;; kernel-packages ;; *print-column* diff --git a/goal_src/kernel/gcommon.gc b/goal_src/kernel/gcommon.gc index b12f231059..5a3e90117e 100644 --- a/goal_src/kernel/gcommon.gc +++ b/goal_src/kernel/gcommon.gc @@ -259,8 +259,386 @@ ) +;; The "print" method of a type should print out a single line representation of the object. +;; The default print method for a basic will be something like # +;; This is used when printing an object with format, using the "~A" format specification. +;; And of course in functions like print, printl. (defmethod print bfloat ((obj bfloat)) "Override the default print method to print a bfloat like a normal float" (format #t "~f" (-> obj data)) obj + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Type System +;;;;;;;;;;;;;;;;;;;;;;;;;; + +; The asize-of method should return the total size in memory used by an object. +; It's used for traversing heaps of basics and copying basics. +; Most basic/structure types are "fixed size", and their default asize-of method will simply +; return the "size" field of their type, so you don't have to worry about it. +; However, some types are dynamic (like a string) and require that you provide your own method. +; A common approach is to have an "allocated-length" field, then have the asize-of method return +; (+ (-> obj type size) (* elem-size (-> obj allocated-length))) +; asize-of returns the actual size, including the type field, and can have any alignment. + +;; A "type" object contains some basic information about a type as well as the list of methods. +;; Some types have more methods than others, so the method table makes "type" a dynamic type. +;; As a result, we should define an "asize-of" method for type. It's possibly unused because it's wrong. + +(defmethod asize-of type ((obj type)) + "Get the size in memory of a type" + ;; The 28 is 8 bytes too large. It's also strange that types have a 16-byte aligned size always, + ;; but this matches what the runtime does as well. There's no reason that I can see for this, + ;; as other basics don't require 16-byte aligned sizes. + (align16 (+ 28 (* 4 (-> type allocated-length)))) + ) + +(defun basic-type? ((obj basic) (input-type type)) + "Is obj an object of type input-type, or of child type of input-type? + Note: checking if a basic is of type object will return #f." + (let ((basics-type (-> obj type)) + (object-type object)) + (until (eq? (set! basics-type (-> basics-type parent)) object-type) + (if (eq? basics-type input-type) + ;; return-from #f will return from the function with the value of #t + (return-from #f #t) + ) + ) + ) + #f ;; didn't find it, return false + ) + +(defun type-type? ((a type) (b type)) + "is a a type (or child type) of type b?" + (until (eq? a object) + ;; it's not clear why a might be zero? + ;; perhaps if the type system is not yet initialized fully for the type? + (if (or (eq? a b) (zero? a)) + (return-from #f #t) + ) + (set! a (-> a parent)) + ) + #f + ) + +(defun find-parent-method ((the-type type) (method-id int)) + "Find the nearest parent which has a different method, and get that method. + Use with extreme caution - if a checked parent has fewer methods than the child, it will + access out-of-bounds memory. Returns the nothing function if it gets to the top and + the parent has the same type, or if any parent has 0 as a method." + (let* ((child-method (-> the-type method-table method-id)) + (parent-method child-method) + ) + + ;; keep looking until we find a different parent method + (until (not (eq? parent-method child-method)) + ;; at the top of the type tree. + (if (eq? the-type object) + (return-from #f nothing) + ) + + (set! the-type (-> the-type parent)) + (set! parent-method (-> the-type method-table method-id)) + (if (eq? 0 (the int parent-method)) + (return-from #f nothing) + ) + ) + parent-method + ) + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; pair and list +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun ref ((obj object) (idx int)) + "Get the nth item from a list. No type checking or range checking is done, so be careful!" + (dotimes (i idx (car obj)) + (set! obj (cdr obj)) + ) + ) + +(defmethod length pair ((obj pair)) + "Get the number of elements in a proper list" + (if (eq? obj '()) + (return-from #f 0) + ) + + (let ((lst (cdr obj)) + (len 1)) + (while (and (not (eq? lst '())) + (pair? lst) + ) + (+1! len) + (set! lst (cdr lst)) + ) + len) + ) + + + +(defmethod asize-of pair ((obj pair)) + "Get the asize of a pair" + (the-as int (-> pair size)) + ) + +(defun last ((obj object)) + "Get the last pair in a list." + (while (not (eq? (cdr obj) '())) + (set! obj (cdr obj)) + ) + obj + ) + +(defun member ((obj object) (lst object)) + "if obj is a member of the list, return the pair containing obj as its car. + if not, return #f." + (while (and (not (eq? lst '())) + (not (eq? (car lst) obj))) + (set! lst (cdr lst)) + ) + + (if (eq? lst '()) + #f + lst + ) + ) + +(define-extern name= (function basic basic symbol)) + +(defun nmember ((obj basic) (lst object)) + "If obj is a member of the list, return the pair containing obj as its car. + If not, return #f. Use name= (see gstring.gc) to check equality." + (while (and (not (eq? lst '())) + (not (name= (the basic (car lst)) obj)) + ) + (set! lst (cdr lst)) + ) + + (if (eq? lst '()) + #f + lst + ) + ) + +(defun assoc ((item object) (alst object)) + "Get a pair with car of item from the association list (list of pairs) alst." + (while (and (not (null? alst)) + (not (eq? (caar alst) item))) + (set! alst (cdr alst)) + ) + (if (not (null? alst)) + (car alst) + #f + ) + ) + +(defun assoce ((item object) (alst object)) + "Like assoc, but a pair with car of 'else will match anything" + (while (and (not (null? alst)) + (not (eq? (caar alst) item)) + (not (eq? (caar alst) 'else)) + ) + (set! alst (cdr alst)) + ) + (if (not (null? alst)) + (car alst) + #f + ) + ) + +;; todo +;; nassoc +;; nassce + +(defun append! ((front object) (back object)) + "Append back to front." + (if (null? front) + (return-from #f back) + ) + + (let ((lst front)) + ;; seek to the end of front + (while (not (null? (cdr lst))) + (set! lst (cdr lst)) + ) + + ;; this check seems not needed + (if (not (null? lst)) + (set! (cdr lst) back) + ) + + front + ) + ) + +(defun delete! ((item object) (lst object)) + "Delete the first occurance of item from a list and return the list. + Does nothing if the item isn't in the list." + (if (eq? (car lst) item) + (return-from #f (cdr lst)) + ) + + (let ((iter (cdr lst)) + (rep lst)) + + (while (and (not (null? iter)) + (not (eq? (car iter) item))) + (set! rep iter) + (set! iter (cdr iter)) + ) + + (if (not (null? iter)) + (set! (cdr rep) (cdr iter)) + ) + ) + (the pair lst) + ) + +(defun delete-car! ((item object) (lst object)) + "Like delete, but will delete if (car item-from-list) is equal to item. Useful for deleting from association list by key." + ;(format #t "call to delete car: ~A ~A~%" item lst) + (if (eq? (caar lst) item) + (return-from #f (cdr lst)) + ) + + (let ((rep lst) + (iter (cdr lst))) + (while (and (not (null? iter)) + (not (eq? (caar iter) item))) + (set! rep iter) + (set! iter (cdr iter)) + ) + + (if (not (null? iter)) + (set! (cdr rep) (cdr iter)) + ) + ) + lst + ) + +(defun insert-cons! ((kv object) (alst object)) + "Insert key-value pair into an association list. Also removes the old one if it was there." + (cons kv (delete-car! (car kv) alst)) + ) + +(defun sort ((lst object) (compare (function object object object))) + "Sort the given list in place. Uses the given comparison function. The comparison function can + either return #t/#f or an integer, in which case the sign of the integer determines lt/gt." + ;; in each iteration, we count how many changes we make. Once we make no changes, the list is sorted. + (let ((changes -1)) + + (while (not (zero? changes)) ;; outer loop + (set! changes 0) ;; reset changes for this iteration + (let ((iter lst)) ;; iterate through list + (while (and (not (null? (cdr iter))) + (pair? (cdr iter))) + ;; L221 + (let* ((val1 (car iter)) ;; value at iterator + (val2 (car (cdr iter))) ;; value after iterator + (c-result (compare val1 val2))) ;; run comparison function + ;; check if val1 and val2 are in order. The compare function may either return #t + ;; or it may return val1 - val2. There is an issue if val1 - val2 happens to equal #t or #f. + (unless (or + (and c-result (<= (the integer c-result) 0)) ;; not #f, and negative, we're sorted! + (eq? c-result #t) ;; explictly return #t, we're sorted! + ) + ;; these two aren't sorted! so we swap them and increment changes. + (+1! changes) + (set! (car iter) val2) + (set! (car (cdr iter)) val1) + ) + ;; move on to the next thing in the list. + (set! iter (cdr iter)) + ) + ) + ) + ) + ) + lst + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; inline array +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; a parent class for boxed "inline arrays" classes, +;; An inline-array is an array with a bunch of objects back-to-back, as opposed to a bunch of +;; references back to back. +;; Most inline-arrays are unboxed and are just data - this is a somewhat rarely used container parent +;; class for a class that wraps an unboxed inline-array. +;; the "heap-base" field of the type is used to store the indexing scale. + +(deftype inline-array-class (basic) + ((length int32 :offset-assert 4) + (allocated-length int32 :offset-assert 8) + (data uint8 :dynamic) + ) + (:methods (new (symbol type int) _type_ 0) ;; we will override print later on. This is optional to include + ) + ) + +(defmethod new inline-array-class ((allocation symbol) (type-to-make type) (cnt int)) + "Create a new inline-array. Sets the length, allocated-length to cnt. Uses the mysterious heap-base field + of the type-to-make to determine the element size" + (let* ((sz (+ (-> type-to-make size) (* (-> type-to-make heap-base) cnt))) + (new-object (object-new (the int sz)))) + ;;(format 0 "create sz ~d at #x~X~%" sz new-object) + (unless (zero? new-object) + (set! (-> new-object length) cnt) + (set! (-> new-object allocated-length) cnt) + ) + new-object + ) + ) + +(defmethod length inline-array-class ((obj inline-array-class)) + ;"Get the length of an inline-array" + (-> obj length) + ) + +(defmethod asize-of inline-array-class ((obj inline-array-class)) + ;"Get the size in memory of an inline-array-class" + (+ (the-as int (-> obj type size)) + (* (-> obj allocated-length) (-> obj type heap-base)) + ) + ) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; array (todo) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; memcpy and similar +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun mem-copy! ((dst pointer) (src pointer) (size integer)) + "Copy memory from src to dst. Size is in bytes. This is not an efficient implementation, + however, there are _no restrictions_ on size, alignment etc. Increasing address copy." + (let ((i 0) + (d (the pointer dst)) + (s (the pointer src)) + ) + + (while (< i size) + (set! (-> (the (pointer uint8) d) 0) (-> (the (pointer uint8) s) 0)) + (&+! d 1) + (&+! s 1) + (+1! i) + ) + ) + dst + ) + +(defun mem-set32! ((dst pointer) (value int) (n int)) + "Memset a 32-bit value n times. Total memory filled is 4 * n bytes." + (let ((p (the pointer dst)) + (i 0)) + (while (< i n) + (set! (-> (the (pointer int32) p) 0) value) + (&+! p 4) + (+1! i) + ) + ) + dst ) \ No newline at end of file diff --git a/goal_src/kernel/gkernel-h.gc b/goal_src/kernel/gkernel-h.gc index f6be879969..65050e91ea 100644 --- a/goal_src/kernel/gkernel-h.gc +++ b/goal_src/kernel/gkernel-h.gc @@ -5,3 +5,5 @@ ;; name in dgo: gkernel-h ;; dgos: KERNEL +(defglobalconstant *kernel-major-version* 2) +(defglobalconstant *kernel-minor-version* 0) \ No newline at end of file diff --git a/goal_src/kernel/gkernel.gc b/goal_src/kernel/gkernel.gc index b65c8a9bc6..f3aa580851 100644 --- a/goal_src/kernel/gkernel.gc +++ b/goal_src/kernel/gkernel.gc @@ -5,3 +5,23 @@ ;; name in dgo: gkernel ;; dgos: KERNEL +(define *kernel-version* (the binteger (logior (ash *kernel-major-version* 16) *kernel-minor-version*))) + +(defun kernel-dispatcher () + "Kernel Dispatcher Function. This gets called from the main loop in kboot.cpp's KernelCheckAndDispatch" + + ;; check if we have a new listener function to run + (when *listener-function* + ;; we do! enable method-set for debug purposes + (+! *enable-method-set* 1) + + ;; execute and print result + (let ((result (*listener-function*))) + (format #t "~D~%" result) + ) + (+! *enable-method-set* -1) + + ;; clear the pending function. + (set! *listener-function* (the (function object) #f)) + ) + ) \ No newline at end of file diff --git a/goal_src/kernel/gstring.gc b/goal_src/kernel/gstring.gc index d79a95dbf3..2c2f0a8e44 100644 --- a/goal_src/kernel/gstring.gc +++ b/goal_src/kernel/gstring.gc @@ -5,3 +5,56 @@ ;; name in dgo: gstring ;; dgos: KERNEL +;; Note on strings: +;; the allocated length does not include an extra byte on the end for the null terminator! + +(defmethod length string ((obj string)) + ; Get the length of a string. Like strlen + (let ((str-ptr (-> obj data))) + (while (!= 0 (-> str-ptr 0)) + (set! str-ptr (the (pointer uint8) (&+ str-ptr 1))) + ) + (- (the int str-ptr) (the int (-> obj data))) + ) + ) + +(defmethod asize-of string ((obj string)) + ;; get the size in bytes of a string. + ;; BUG - string should probably be (-> obj type), not that it matters, I don't think + ;; anybody makes a subclass of string. + (+ (-> obj allocated-length) 1 (-> string size)) + ) + +(defun copy-string<-string ((dst string) (src string)) + "Copy data from one string to another, like strcpy" + (let ((dst-ptr (-> dst data)) + (src-ptr (-> src data)) + ) + (while (!= 0 (-> src-ptr)) + (set! (-> dst-ptr) (-> src-ptr)) + (&+! dst-ptr 1) + (&+! src-ptr 1) + ) + ) + ) + +(defmethod new string ((allocation symbol) (type-to-make type) (size int) (other string)) + "Create a new string of the given size. If other is not #f, copy data from it." + (cond + (other + (let* ((desired-size (max (length other) size)) + (new-obj (object-new (+ desired-size 1 (-> type-to-make size)))) + ) + (set! (-> new-obj allocated-length) size) + (copy-string<-string new-obj other) + new-obj + ) + ) + (else + (let ((new-obj (object-new (+ 1 size (-> type-to-make size))))) + (set! (-> new-obj allocated-length) size) + new-obj + ) + ) + ) + ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-access-inline-array.gc b/goal_src/test/test-access-inline-array.gc similarity index 52% rename from test/old_goal_tests/tests/test-access-inline-array.gc rename to goal_src/test/test-access-inline-array.gc index ff22645301..16cc8641b9 100644 --- a/test/old_goal_tests/tests/test-access-inline-array.gc +++ b/goal_src/test/test-access-inline-array.gc @@ -1,19 +1,17 @@ - ;-*-Scheme-*- - -(test-setup 1.2345 #f) - -(let* ((new-method (-> bfloat methods 0)) - (print-method (-> bfloat methods 2)) - (my-float (the bfloat (new-method 'global bfloat))) +(let* ((print-method (method bfloat print)) + (my-float (new 'global 'bfloat)) ) (set! (-> my-float data) 1.23456) (print-method my-float) (format #t "~%") ) +#| (let ((x 0)) (while (< x 9) - (format #t "method ~d of ~A is ~A~%" x bfloat (-> bfloat methods x)) + (format #t "method ~d of ~A is ~A~%" x bfloat (-> bfloat method-table x)) (+1! x) ) ) +|# + 0 \ No newline at end of file diff --git a/goal_src/test/test-addr-of.gc b/goal_src/test/test-addr-of.gc new file mode 100644 index 0000000000..a26ffa4b45 --- /dev/null +++ b/goal_src/test/test-addr-of.gc @@ -0,0 +1,15 @@ + +(start-test "addr-of") +(deftype addr-of-test-type (basic) + ((v1 int32 :offset-assert 4) + (arr int32 12 :offset-assert 8) + (end uint8 :offset-assert 56) + ) + ) + +(let ((temp (new 'global 'addr-of-test-type))) + (expect-true (= 8 (&- (&-> temp arr 1) temp))) + (expect-true (= 0 (&- (&-> temp v1) temp))) + ) + +(finish-test) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-align16-1.gc b/goal_src/test/test-align16-1.gc similarity index 57% rename from test/old_goal_tests/tests/test-align16-1.gc rename to goal_src/test/test-align16-1.gc index d1c9fb6ebc..3a02feaf7b 100644 --- a/test/old_goal_tests/tests/test-align16-1.gc +++ b/goal_src/test/test-align16-1.gc @@ -1,6 +1 @@ - ;-*-Scheme-*- - - -(test-setup 80 #f) - -(+ (align16 1) (align16 (* 3 5)) (align16 (/ 32 2)) (align16 (- -17))) +(+ (align16 1) (align16 (* 3 5)) (align16 (/ 32 2)) (align16 (- -17))) \ No newline at end of file diff --git a/goal_src/test/test-align16-2.gc b/goal_src/test/test-align16-2.gc new file mode 100644 index 0000000000..c7630b8bea --- /dev/null +++ b/goal_src/test/test-align16-2.gc @@ -0,0 +1,5 @@ +(defun type-method-check ((obj type)) + (align16 (+ 28 (* 4 (-> obj allocated-length)))) + ) + +(type-method-check integer) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-append.gc b/goal_src/test/test-append.gc similarity index 69% rename from test/old_goal_tests/tests/test-append.gc rename to goal_src/test/test-append.gc index d2df72e9b7..01fa784f22 100644 --- a/test/old_goal_tests/tests/test-append.gc +++ b/goal_src/test/test-append.gc @@ -1,4 +1,4 @@ -(test-setup '(a b c d e) #f) - (format #t "~A~%" (append! (list 'a 'b) (list 'c 'd 'e))) + + 0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-approx-pi.gc b/goal_src/test/test-approx-pi.gc similarity index 94% rename from test/old_goal_tests/tests/test-approx-pi.gc rename to goal_src/test/test-approx-pi.gc index efb818a4e2..61af791749 100644 --- a/test/old_goal_tests/tests/test-approx-pi.gc +++ b/goal_src/test/test-approx-pi.gc @@ -1,6 +1,4 @@ - - -(test-setup 1 #f) +(start-test "approx-pi") (defun test-approx-pi ((res integer)) (let ((rad (* res res)) @@ -48,5 +46,4 @@ (expect-true (< approx-pi 3.15)) ) -;(format #t "~f~%" (test-approx-pi 1000)) -1 \ No newline at end of file +(finish-test) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-assoc-1.gc b/goal_src/test/test-assoc-1.gc similarity index 64% rename from test/old_goal_tests/tests/test-assoc-1.gc rename to goal_src/test/test-assoc-1.gc index 0b2e1fa17f..a0ae271b3f 100644 --- a/test/old_goal_tests/tests/test-assoc-1.gc +++ b/goal_src/test/test-assoc-1.gc @@ -1,7 +1,3 @@ -(test-setup 'w #f) - (format #t "~A~%" (cdr (assoc 'e (list (cons 'a 'b) (cons 'e 'w) (cons 'x 'x))))) - - -(print-type (assoc 'a '())) + 0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-assoc-2.gc b/goal_src/test/test-assoc-2.gc similarity index 80% rename from test/old_goal_tests/tests/test-assoc-2.gc rename to goal_src/test/test-assoc-2.gc index 78467fe506..831ceb4d6d 100644 --- a/test/old_goal_tests/tests/test-assoc-2.gc +++ b/goal_src/test/test-assoc-2.gc @@ -1,4 +1,3 @@ -(test-setup #f #f) - (format #t "~A~%" (assoc 'r (list (cons 'a 'b) (cons 'e 'w) (cons 'x 'x)))) + 0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-assoce-1.gc b/goal_src/test/test-assoce-1.gc similarity index 82% rename from test/old_goal_tests/tests/test-assoce-1.gc rename to goal_src/test/test-assoce-1.gc index abac90cb8d..f47671ed55 100644 --- a/test/old_goal_tests/tests/test-assoce-1.gc +++ b/goal_src/test/test-assoce-1.gc @@ -1,4 +1,3 @@ -(test-setup 'x #f) - (format #t "~A~%" (cdr (assoce 'r (list (cons 'a 'b) (cons 'e 'w) (cons 'else 'x))))) + 0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-assoce-2.gc b/goal_src/test/test-assoce-2.gc similarity index 82% rename from test/old_goal_tests/tests/test-assoce-2.gc rename to goal_src/test/test-assoce-2.gc index 17343d3cef..7697008bc5 100644 --- a/test/old_goal_tests/tests/test-assoce-2.gc +++ b/goal_src/test/test-assoce-2.gc @@ -1,4 +1,3 @@ -(test-setup 'x #f) - (format #t "~A~%" (cdr (assoce 'r (list (cons 'a 'b) (cons 'r 'x) (cons 'else 'w))))) + 0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-basic-type-check.gc b/goal_src/test/test-basic-type-check.gc similarity index 64% rename from test/old_goal_tests/tests/test-basic-type-check.gc rename to goal_src/test/test-basic-type-check.gc index e4670fed79..9c06f84de6 100644 --- a/test/old_goal_tests/tests/test-basic-type-check.gc +++ b/goal_src/test/test-basic-type-check.gc @@ -1,11 +1,4 @@ - ;-*-Scheme-*- - -(test-setup '#f#t#t#f#t#f#t#t #f) - -;; awful hack to create a bfloat at #x6000000 -(define-extern hack-bfloat integer) -(define hack-bfloat (+ #x6000000 *gtype-basic-offset*)) -(define-extern hack-bfloat bfloat) +(define hack-bfloat (new 'global 'bfloat)) (format #t "~A~A~A~A" @@ -21,4 +14,4 @@ (basic-type? #f basic) ;; #t (basic-type? inspect function) ;; #t ) - + 0 \ No newline at end of file diff --git a/goal_src/test/test-bfloat.gc b/goal_src/test/test-bfloat.gc new file mode 100644 index 0000000000..5ba4f8c02f --- /dev/null +++ b/goal_src/test/test-bfloat.gc @@ -0,0 +1,7 @@ +(define hack-bfloat (new 'global 'bfloat)) + +(set! (-> hack-bfloat type) bfloat) +(set! (-> hack-bfloat data) 1.233) + +(format #t "data ~f print ~A type ~A~%" (-> hack-bfloat data) hack-bfloat (-> hack-bfloat type)) +0 \ No newline at end of file diff --git a/goal_src/test/test-binteger-print.gc b/goal_src/test/test-binteger-print.gc new file mode 100644 index 0000000000..7f5140d28b --- /dev/null +++ b/goal_src/test/test-binteger-print.gc @@ -0,0 +1,2 @@ +(format #t "~A~%" (the binteger -17)) +0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-car-cdr-get.gc b/goal_src/test/test-car-cdr-get.gc similarity index 66% rename from test/old_goal_tests/tests/test-car-cdr-get.gc rename to goal_src/test/test-car-cdr-get.gc index a93ac57088..993a84cc43 100644 --- a/test/old_goal_tests/tests/test-car-cdr-get.gc +++ b/goal_src/test/test-car-cdr-get.gc @@ -1,8 +1,4 @@ - ;-*-Scheme-*- - - -(test-setup 'ab #f) - (let ((my-pair (cons 'a 'b))) (format #t "~A~A~%" (car my-pair) (cdr my-pair)) ) + 0 \ No newline at end of file diff --git a/goal_src/test/test-car-cdr-set.gc b/goal_src/test/test-car-cdr-set.gc new file mode 100644 index 0000000000..07cb6b3c6f --- /dev/null +++ b/goal_src/test/test-car-cdr-set.gc @@ -0,0 +1,6 @@ +(let ((my-pair (cons 'a 'b))) + (set! (car my-pair) 'c) + (set! (cdr my-pair) 'd) + (format #t "~A~%" my-pair) + ) + 0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-condition-boolean.gc b/goal_src/test/test-condition-boolean.gc similarity index 86% rename from test/old_goal_tests/tests/test-condition-boolean.gc rename to goal_src/test/test-condition-boolean.gc index 78882baf30..61f2fb5323 100644 --- a/test/old_goal_tests/tests/test-condition-boolean.gc +++ b/goal_src/test/test-condition-boolean.gc @@ -1,7 +1,3 @@ - ;-*-Scheme-*- - -(test-setup 4 #f) - (let ((total 0)) (if (true-func) (+! total 1) @@ -23,5 +19,4 @@ (+! total 999) ) total - ) - + ) \ No newline at end of file diff --git a/goal_src/test/test-cons.gc b/goal_src/test/test-cons.gc new file mode 100644 index 0000000000..1c438d1799 --- /dev/null +++ b/goal_src/test/test-cons.gc @@ -0,0 +1,2 @@ +(format #t "~A~%" (cons 'a 'b)) +0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-delete-car.gc b/goal_src/test/test-delete-car.gc similarity index 87% rename from test/old_goal_tests/tests/test-delete-car.gc rename to goal_src/test/test-delete-car.gc index 90a6c9275d..450c453b48 100644 --- a/test/old_goal_tests/tests/test-delete-car.gc +++ b/goal_src/test/test-delete-car.gc @@ -1,5 +1,3 @@ -(test-setup '((a . b) (e . f)) #f) - (let ((my-list (list (cons 'a 'b) (cons 'c 'd) (cons 'e 'f) @@ -9,3 +7,4 @@ (format #t "~A~%" my-list) (format #t "~A~%" (assoc 'c my-list)) ) +0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-delete-list.gc b/goal_src/test/test-delete-list.gc similarity index 68% rename from test/old_goal_tests/tests/test-delete-list.gc rename to goal_src/test/test-delete-list.gc index 9e5b3d8877..75d49e2d58 100644 --- a/test/old_goal_tests/tests/test-delete-list.gc +++ b/goal_src/test/test-delete-list.gc @@ -1,4 +1,3 @@ -(test-setup '(a b d e) #f) - (format #t "~A~%" (delete! 'c (list 'a 'b 'c 'd 'e))) + 0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-dotimes.gc b/goal_src/test/test-dotimes.gc similarity index 69% rename from test/old_goal_tests/tests/test-dotimes.gc rename to goal_src/test/test-dotimes.gc index b3a8365400..3c3afe007d 100644 --- a/test/old_goal_tests/tests/test-dotimes.gc +++ b/goal_src/test/test-dotimes.gc @@ -1,11 +1,6 @@ - ;-*-Scheme-*- - - -(test-setup 4950 #f) - (let ((sum 0)) (dotimes (i 100 7 8 9 sum) (+! sum i) ;;(format #t "iter ~D sum ~D~%" i sum) ) - ) + ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-dynamic-type.gc b/goal_src/test/test-dynamic-type.gc similarity index 61% rename from test/old_goal_tests/tests/test-dynamic-type.gc rename to goal_src/test/test-dynamic-type.gc index 5e29d5b682..f0a13aa1c5 100644 --- a/test/old_goal_tests/tests/test-dynamic-type.gc +++ b/goal_src/test/test-dynamic-type.gc @@ -1,13 +1,12 @@ - -(test-setup 1 #f) +(start-test "dynamic-type") (deftype test-dynamic-type (basic) ( - (pad0 int16 :offset 0) - (allocated-length int32 :offset 4) - (data int32 :dynamic :offset 8) - (over1 int32 :offset 8) - (over2 int32 :offset 12) + (pad0 int16 :offset 4) + (allocated-length int32 :offset 8) + (data int32 :dynamic :offset 12) + (over1 int32 :offset 12) + (over2 int32 :offset 16) ) ) @@ -15,12 +14,13 @@ (defmethod new test-dynamic-type ((allocation symbol) (type-to-make type) (cnt integer)) ;"Create a new inline-array. Sets the length, allocated-length to cnt. Uses the mysterious heap-base field ;of the type-to-make to determine the element size" - (let* ((sz (+ (-> type-to-make asize) (* 4 cnt))) - (new-object (object-new sz))) + (let* ((sz (+ (-> type-to-make size) (* 4 cnt))) + (new-object (object-new (the int sz)))) ;;(format 0 "create sz ~d at #x~X~%" sz new-object) (unless (zero? new-object) (set! (-> new-object allocated-length) cnt) ) + new-object ) ) @@ -31,28 +31,34 @@ ) (defmethod asize-of test-dynamic-type ((obj test-dynamic-type)) + ;"Get the size in memory of it" - (+ (-> obj type asize) + (the int (+ (-> obj type size) (* (-> obj allocated-length) 4) - ) + )) ) (define test-dynamic-obj - (the test-dynamic-type ((-> test-dynamic-type methods 0) 'global test-dynamic-type 40))) + (the test-dynamic-type (new 'global 'test-dynamic-type 40))) -;(inspect test-dynamic-obj) + +; ;(define test-dynamic-obj (new 'global 'test-dynamic-type 40)) + +; ;(inspect test-dynamic-obj) (set! (-> test-dynamic-obj data 0) 12) (set! (-> test-dynamic-obj data 1) 20) -;(inspect test-dynamic-obj) +; ;(inspect test-dynamic-obj) -; (format #t "should be same (~d ~d) (~d ~d)~%" (-> test-dynamic-obj data 0) (-> test-dynamic-obj over1) -; (-> test-dynamic-obj data 1) (-> test-dynamic-obj over2)) +; ; (format #t "should be same (~d ~d) (~d ~d)~%" (-> test-dynamic-obj data 0) (-> test-dynamic-obj over1) +; ; (-> test-dynamic-obj data 1) (-> test-dynamic-obj over2)) (expect-true (= (-> test-dynamic-obj data 0) (-> test-dynamic-obj over1))) (expect-true (= (-> test-dynamic-obj data 1) (-> test-dynamic-obj over2))) (set! (-> test-dynamic-obj pad0) 0) (expect-true (= (-> test-dynamic-obj type) test-dynamic-type)) + (expect-true (= (asize-of test-dynamic-obj) 180)) -1 \ No newline at end of file + +(finish-test) \ No newline at end of file diff --git a/goal_src/test/test-empty-pair.gc b/goal_src/test/test-empty-pair.gc new file mode 100644 index 0000000000..8e284be273 --- /dev/null +++ b/goal_src/test/test-empty-pair.gc @@ -0,0 +1,2 @@ +(format #t "~A~%" '()) +0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-find-parent-method.gc b/goal_src/test/test-find-parent-method.gc similarity index 81% rename from test/old_goal_tests/tests/test-find-parent-method.gc rename to goal_src/test/test-find-parent-method.gc index e4c9dca5fc..cd3f307eae 100644 --- a/test/old_goal_tests/tests/test-find-parent-method.gc +++ b/goal_src/test/test-find-parent-method.gc @@ -1,12 +1,8 @@ - ;-*-Scheme-*- - -(test-setup "test pass!" #f) - (let ((test-result "test fail!")) ;; first, do one where we get something (if (eq? - (-> structure methods 1) + (-> structure method-table 1) (find-parent-method bfloat 1) ) (set! test-result "test pass!") @@ -23,5 +19,4 @@ (print test-result) ) - - +0 \ No newline at end of file diff --git a/goal_src/test/test-format-reg-order.gc b/goal_src/test/test-format-reg-order.gc index 4339feca42..d875fbc6a1 100644 --- a/goal_src/test/test-format-reg-order.gc +++ b/goal_src/test/test-format-reg-order.gc @@ -1,4 +1,3 @@ -(define-extern _format function) (define format _format) (format #t "test ~D ~D ~D ~D ~D ~D~%" 1 2 3 4 5 6) diff --git a/goal_src/test/test-inline-array-field.gc b/goal_src/test/test-inline-array-field.gc new file mode 100644 index 0000000000..19d2aeff4b --- /dev/null +++ b/goal_src/test/test-inline-array-field.gc @@ -0,0 +1,6 @@ +(let* ((base (the int integer)) + (field (the int (-> integer method-table))) + (offset (- field base))) + ;;(format #t "offset of methods table is ~d~%" offset) + offset + ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-insert-cons.gc b/goal_src/test/test-insert-cons.gc similarity index 80% rename from test/old_goal_tests/tests/test-insert-cons.gc rename to goal_src/test/test-insert-cons.gc index a77d63fb95..f7ce9e8286 100644 --- a/test/old_goal_tests/tests/test-insert-cons.gc +++ b/goal_src/test/test-insert-cons.gc @@ -1,8 +1,7 @@ -(test-setup '((c . w) (a . b) (e . f)) #f) - (let ((alist (list (cons 'a 'b) (cons 'c 'd) (cons 'e 'f)))) (set! alist (insert-cons! (cons 'c 'w) alist)) (format #t "~A~%" alist) ) + 0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-last.gc b/goal_src/test/test-last.gc similarity index 63% rename from test/old_goal_tests/tests/test-last.gc rename to goal_src/test/test-last.gc index c56f5ca1d8..8e7ab40e2e 100644 --- a/test/old_goal_tests/tests/test-last.gc +++ b/goal_src/test/test-last.gc @@ -1,6 +1,4 @@ - ;-*-Scheme-*- - -(test-setup 'd #f) (format #t "~A~%" (car (last (list 'a 'b 'c 'd))) ) + 0 \ No newline at end of file diff --git a/goal_src/test/test-list.gc b/goal_src/test/test-list.gc new file mode 100644 index 0000000000..aaa5b63e8f --- /dev/null +++ b/goal_src/test/test-list.gc @@ -0,0 +1 @@ +(format #t "~A~%" (list 'a 'b 'c 'd)) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-member-1.gc b/goal_src/test/test-member-1.gc similarity index 70% rename from test/old_goal_tests/tests/test-member-1.gc rename to goal_src/test/test-member-1.gc index 8f0ab48a37..51746fd553 100644 --- a/test/old_goal_tests/tests/test-member-1.gc +++ b/goal_src/test/test-member-1.gc @@ -1,4 +1,3 @@ -(test-setup '(c d) #f) - (format #t "~A~%" (member 'c (list 'a 'b 'c 'd))) + 0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-member-2.gc b/goal_src/test/test-member-2.gc similarity index 66% rename from test/old_goal_tests/tests/test-member-2.gc rename to goal_src/test/test-member-2.gc index 2671d41277..03447777d9 100644 --- a/test/old_goal_tests/tests/test-member-2.gc +++ b/goal_src/test/test-member-2.gc @@ -1,5 +1,3 @@ -(test-setup #f #f) - (format #t "~A~%" (member 1234 (list 'a 'b 'c 'd)) - ) + ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-memcpy.gc b/goal_src/test/test-memcpy.gc similarity index 79% rename from test/old_goal_tests/tests/test-memcpy.gc rename to goal_src/test/test-memcpy.gc index 175ab9237e..b4b94e343b 100644 --- a/test/old_goal_tests/tests/test-memcpy.gc +++ b/goal_src/test/test-memcpy.gc @@ -1,8 +1,3 @@ - ;-*-Scheme-*- - -;; add two constants together. -(test-setup 13 #f) - (let* ((base-addr #x6000000) (offset #x123) (ptr-int32 (the (pointer int32) base-addr)) @@ -14,5 +9,3 @@ (-> ptr-int16 3) ) ) - - diff --git a/test/old_goal_tests/tests/test-memset.gc b/goal_src/test/test-memset.gc similarity index 65% rename from test/old_goal_tests/tests/test-memset.gc rename to goal_src/test/test-memset.gc index 0995d5c31b..0a06fb8428 100644 --- a/test/old_goal_tests/tests/test-memset.gc +++ b/goal_src/test/test-memset.gc @@ -1,8 +1,3 @@ - ;-*-Scheme-*- - -;; add two constants together. -(test-setup #x0b #f) - (let* ((base-addr #x6000000) (word-cnt 23) (base (the (pointer int32) base-addr)) @@ -12,14 +7,12 @@ ) (if (!= dst base) - (format #t "test failed, bad base returned!~%") - ) - + (format #t "test failed, bad base returned!~%") + ) + (if (!= 0 (-> last-byte 1)) - (format #t "set too many bytes!~%") - ) - + (format #t "set too many bytes!~%") + ) + (-> last-byte 0) - ) - - + ) \ No newline at end of file diff --git a/goal_src/test/test-methods.gc b/goal_src/test/test-methods.gc new file mode 100644 index 0000000000..c6934c3bb4 --- /dev/null +++ b/goal_src/test/test-methods.gc @@ -0,0 +1,4 @@ +(format #t "~A~A~%" (eq? (-> process method-table 2) (method process print)) + (eq? (-> string method-table 3) (method "test" inspect)) + ) +0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-nested-car-cdr-set.gc b/goal_src/test/test-nested-car-cdr-set.gc similarity index 87% rename from test/old_goal_tests/tests/test-nested-car-cdr-set.gc rename to goal_src/test/test-nested-car-cdr-set.gc index 1864a1b255..f3f281176d 100644 --- a/test/old_goal_tests/tests/test-nested-car-cdr-set.gc +++ b/goal_src/test/test-nested-car-cdr-set.gc @@ -1,8 +1,3 @@ - ;-*-Scheme-*- - - -(test-setup 'efgh #f) - (let ((my-pair (cons (cons 'a 'b) (cons 'c 'd)))) (set! (car (car my-pair)) 'e) (set! (car (cdr my-pair)) 'f) @@ -11,3 +6,4 @@ (format #t "~A~A~A~A~%" (car (car my-pair)) (car (cdr my-pair)) (cdr (car my-pair)) (cdr (cdr my-pair))) (format #t "~A~%" my-pair) ) + 0 \ No newline at end of file diff --git a/goal_src/test/test-nested-float-functions.gc b/goal_src/test/test-nested-float-functions.gc index d00a5d7936..dac9531843 100644 --- a/goal_src/test/test-nested-float-functions.gc +++ b/goal_src/test/test-nested-float-functions.gc @@ -1,4 +1,3 @@ -(define-extern _format function) (define format _format) (defun float-testing-function-2 ((x float) (y float)) diff --git a/goal_src/test/test-new-inline-array-class.gc b/goal_src/test/test-new-inline-array-class.gc new file mode 100644 index 0000000000..e3b953ad5f --- /dev/null +++ b/goal_src/test/test-new-inline-array-class.gc @@ -0,0 +1,14 @@ +(deftype my-inline-array-type (inline-array-class) + () + ) + +(set! (-> my-inline-array-type heap-base) 12) + +(let ((my-inline-array-obj + (the my-inline-array-type + (new + 'debug + 'my-inline-array-type + 234)))) + (asize-of my-inline-array-obj) + ) \ No newline at end of file diff --git a/goal_src/test/test-new-string.gc b/goal_src/test/test-new-string.gc new file mode 100644 index 0000000000..fc0e3bed9a --- /dev/null +++ b/goal_src/test/test-new-string.gc @@ -0,0 +1,12 @@ +(start-test "new-string") + +(let ((new-string (new 'global 'string 17 "alligator"))) + (expect-true (= 17 (-> new-string allocated-length))) + (expect-true (= 9 (length new-string))) + + (expect-true (= #x61 (-> new-string data 0))) ;; a + (expect-true (= #x72 (-> new-string data 8))) ;; r + (expect-true (= #x00 (-> new-string data 9))) ;; \0 + ) + +(finish-test) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-number-comparison.gc b/goal_src/test/test-number-comparison.gc similarity index 89% rename from test/old_goal_tests/tests/test-number-comparison.gc rename to goal_src/test/test-number-comparison.gc index 6bc969d784..e378a649e8 100644 --- a/test/old_goal_tests/tests/test-number-comparison.gc +++ b/goal_src/test/test-number-comparison.gc @@ -1,5 +1,4 @@ -(test-setup 4 #f) - +(start-test "number-comparison") (expect-true (= 1.2 1.2)) (expect-true (= 1 1)) (expect-false (!= 1.2 1.2)) @@ -18,4 +17,4 @@ (expect-true (= 0.6 (- 1.2 0.6))) (expect-true (= 0.6 (- 1.0 0.2 0.2))) (expect-true (= 0.6 (- -0.6))) -4 \ No newline at end of file +(finish-test) \ No newline at end of file diff --git a/goal_src/test/test-pair-asize.gc b/goal_src/test/test-pair-asize.gc new file mode 100644 index 0000000000..9966daeab4 --- /dev/null +++ b/goal_src/test/test-pair-asize.gc @@ -0,0 +1,3 @@ +(let ((lst (list 5 4))) + (asize-of (the pair lst)) + ) \ No newline at end of file diff --git a/goal_src/test/test-pair-check.gc b/goal_src/test/test-pair-check.gc new file mode 100644 index 0000000000..63ce63cbbb --- /dev/null +++ b/goal_src/test/test-pair-check.gc @@ -0,0 +1,2 @@ +(format #t "~A~A~%" (pair? '()) (pair? integer)) +0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-pair-length.gc b/goal_src/test/test-pair-length.gc similarity index 57% rename from test/old_goal_tests/tests/test-pair-length.gc rename to goal_src/test/test-pair-length.gc index f47e613a49..b790806448 100644 --- a/test/old_goal_tests/tests/test-pair-length.gc +++ b/goal_src/test/test-pair-length.gc @@ -1,7 +1,3 @@ - ;-*-Scheme-*- - -(test-setup 6 #f) (let ((lst (list 5 4 3 2 1 0))) (length (the pair lst)) - ) - + ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-pointer-as-array-numbers.gc b/goal_src/test/test-pointers-1.gc similarity index 74% rename from test/old_goal_tests/tests/test-pointer-as-array-numbers.gc rename to goal_src/test/test-pointers-1.gc index 0e0ab51447..c3481c1350 100644 --- a/test/old_goal_tests/tests/test-pointer-as-array-numbers.gc +++ b/goal_src/test/test-pointers-1.gc @@ -1,8 +1,3 @@ - ;-*-Scheme-*- - -;; add two constants together. -(test-setup 13 #f) - (let* ((base-addr #x6000000) (ptr-int32 (the (pointer int32) base-addr)) (ptr-int16 (the (pointer int16) base-addr)) @@ -11,6 +6,4 @@ (+ (-> ptr-int16 2) (-> ptr-int16 3) ) - ) - - + ) \ No newline at end of file diff --git a/goal_src/test/test-ref.gc b/goal_src/test/test-ref.gc new file mode 100644 index 0000000000..ba45e08cf8 --- /dev/null +++ b/goal_src/test/test-ref.gc @@ -0,0 +1 @@ +(ref (list 1 23 5 83 4) 3) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-return-from-f-tricky-color.gc b/goal_src/test/test-return-from-f-tricky-color.gc similarity index 61% rename from test/old_goal_tests/tests/test-return-from-f-tricky-color.gc rename to goal_src/test/test-return-from-f-tricky-color.gc index 2536e18675..a72b624c43 100644 --- a/test/old_goal_tests/tests/test-return-from-f-tricky-color.gc +++ b/goal_src/test/test-return-from-f-tricky-color.gc @@ -1,16 +1,15 @@ - ;-*-Scheme-*- +(define format _format) +;(db) - -(test-setup 77 #f) +;(format #t "running~%") (defun get-an-integer () 12) - -(defun test-function ((x integer)) +(defun test-function-5 ((x int)) (while (> x 20) (set! x (- x 1)) - ;;(format #t " x is now ~d~%" x) + ;(format #t " x is now ~d~%" x) (if (> 30 x) (return-from #f 77) ) @@ -22,7 +21,6 @@ ) ) -(let ((result (test-function 64))) +(let ((result (test-function-5 64))) result - ) - + ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-return-from-f.gc b/goal_src/test/test-return-from-f.gc similarity index 59% rename from test/old_goal_tests/tests/test-return-from-f.gc rename to goal_src/test/test-return-from-f.gc index c64e7632ef..dff98c0d0a 100644 --- a/test/old_goal_tests/tests/test-return-from-f.gc +++ b/goal_src/test/test-return-from-f.gc @@ -1,9 +1,4 @@ - ;-*-Scheme-*- - - -(test-setup 77 #f) - -(defun test-function ((x integer)) +(defun test-function-3 ((x int)) (while (> x 20) (set! x (- x 1)) ;;(format #t " x is now ~d~%" x) @@ -14,7 +9,6 @@ 987 ) -(let ((result (test-function 64))) +(let ((result (test-function-3 64))) result - ) - + ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-return-value-of-if.gc b/goal_src/test/test-return-value-of-if.gc similarity index 69% rename from test/old_goal_tests/tests/test-return-value-of-if.gc rename to goal_src/test/test-return-value-of-if.gc index cdc7b9cc0d..a5dd94a0e5 100644 --- a/test/old_goal_tests/tests/test-return-value-of-if.gc +++ b/goal_src/test/test-return-value-of-if.gc @@ -1,13 +1,7 @@ - ;-*-Scheme-*- - -(test-setup 123 #f) - - (let ((x (if (> 1 2) "a string!")) (y (if (> 2 1) 123))) (if x (format #t "failure!") ) y - ) - + ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-set-self.gc b/goal_src/test/test-set-self.gc similarity index 69% rename from test/old_goal_tests/tests/test-set-self.gc rename to goal_src/test/test-set-self.gc index 708e4b3b11..f5d64b690a 100644 --- a/test/old_goal_tests/tests/test-set-self.gc +++ b/goal_src/test/test-set-self.gc @@ -1,20 +1,17 @@ -(test-setup 12 #f) - (deftype self-test-type (basic) - ((self self-test-type)) + ((self basic)) ) (defmethod new self-test-type ((allocation symbol) (type-to-make type)) (let ((obj (object-new))) ;; here the register of obj is used both as a "real" pointer and a GOAL pointer in the same instruction. - ;; this is a special case in the emitter. + ;; this was a tricky thing to get right in the old compiler, so its worth testing. (set! (-> obj self) obj) obj ) ) (let ((temp (new 'global 'self-test-type))) - (expect-true (eq? temp (-> temp self))) + (format #t "~A~%" (eq? temp (-> temp self))) ) - -12 \ No newline at end of file +0 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-signed-int-compare.gc b/goal_src/test/test-signed-int-compare.gc similarity index 89% rename from test/old_goal_tests/tests/test-signed-int-compare.gc rename to goal_src/test/test-signed-int-compare.gc index 4b03e3dad4..5399018204 100644 --- a/test/old_goal_tests/tests/test-signed-int-compare.gc +++ b/goal_src/test/test-signed-int-compare.gc @@ -1,8 +1,3 @@ - ;-*-Scheme-*- - -;; test many comparisons of signed numbers -(test-setup 12 #f) - (let ((total 0)) (if (> 2 -1) (+! total 1) @@ -54,4 +49,4 @@ (+! total 999) ) total - ) + ) \ No newline at end of file diff --git a/goal_src/test/test-sort-2.gc b/goal_src/test/test-sort-2.gc new file mode 100644 index 0000000000..abe02e3c5d --- /dev/null +++ b/goal_src/test/test-sort-2.gc @@ -0,0 +1,14 @@ +(defmacro blist (&rest args) + (if (null? args) + (quote '()) + `(cons (ash ,(car args) 3) (blist ,@(cdr args))) + ) + ) + +(let ((my-list + (blist 24 16 32 56 72 1234 -34 25 654) + )) + (format #t "~A~%" my-list) + (sort my-list -) + (format #t "~A~%" my-list) + ) \ No newline at end of file diff --git a/goal_src/test/test-sort-3.gc b/goal_src/test/test-sort-3.gc new file mode 100644 index 0000000000..a95c61ad26 --- /dev/null +++ b/goal_src/test/test-sort-3.gc @@ -0,0 +1,12 @@ +(defmacro blist (&rest args) + (if (null? args) + (quote '()) + `(cons (ash ,(car args) 3) (blist ,@(cdr args))) + ) + ) + +(let ((my-list (blist 24 16 32 56 72 1234 -34 25 654))) + (format #t "~A~%" my-list) + (sort my-list (lambda ((x int) (y int)) (< x y))) + (format #t "~A~%" my-list) + ) \ No newline at end of file diff --git a/goal_src/test/test-sort.gc b/goal_src/test/test-sort.gc new file mode 100644 index 0000000000..49ad2dac8c --- /dev/null +++ b/goal_src/test/test-sort.gc @@ -0,0 +1,14 @@ +(defmacro blist (&rest args) + (if (null? args) + (quote '()) + `(cons (ash ,(car args) 3) (blist ,@(cdr args))) + ) + ) + +(let ((my-list + (blist 24 16 32 56 72 1234 -34 25 654) + )) + (format #t "~A~%" my-list) + (sort my-list (lambda ((x int) (y int)) (- y x))) + (format #t "~A~%" my-list) + ) \ No newline at end of file diff --git a/goal_src/test/test-string-type.gc b/goal_src/test/test-string-type.gc new file mode 100644 index 0000000000..3161186a23 --- /dev/null +++ b/goal_src/test/test-string-type.gc @@ -0,0 +1,17 @@ +(start-test "string-type") +; (db) +(expect-true (= 101 (-> "test" data 1))) +(expect-true (= 4 (-> "test" allocated-length))) +(expect-true (= 13 (asize-of "test"))) +(let ((temp "test")) + ; (format #t "before: ~D ~D~%" (-> temp data 1) (-> temp data 2)) + (set! (-> temp data 1) 102) + ;(format #t "after: ~D ~D~%" (-> temp data 1) (-> temp data 2)) + ; (print-type (-> temp data 1)) + (set! (-> temp data 3) 0) + ; (format #t "length is ~D~%" (length temp)) + ; (inspect temp) + (expect-true (= 3 (length temp))) + ) + +(finish-test) \ No newline at end of file diff --git a/goal_src/test/test-tests.gc b/goal_src/test/test-tests.gc new file mode 100644 index 0000000000..e708131544 --- /dev/null +++ b/goal_src/test/test-tests.gc @@ -0,0 +1,8 @@ +(start-test "test-of-test") + + +(expect-eq 1 2) +(expect-eq 1 3 :name "test") +(expect-eq 5 5) + +(finish-test) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-type-arrays.gc b/goal_src/test/test-type-arrays.gc similarity index 58% rename from test/old_goal_tests/tests/test-type-arrays.gc rename to goal_src/test/test-type-arrays.gc index 2ec28d3e69..f2ba05b7e9 100644 --- a/test/old_goal_tests/tests/test-type-arrays.gc +++ b/goal_src/test/test-type-arrays.gc @@ -1,14 +1,4 @@ -(test-setup 18 #f) - -;; no value, no array, no inline - -;; todo test signed/unsigned loads/stores etc... - -;; TODO - this test is not done. - -(defmacro new-type-hack (type-name) - `(the ,type-name ((-> ,type-name methods 0) 'global ,type-name)) - ) +(start-test "test-type-arrays") (deftype basic-type (basic) ( @@ -26,11 +16,11 @@ ) ) -(let ((obj-test (new-type-hack struct-type))) +(let ((obj-test (new 'global 'struct-type))) ;(inspect obj-test) (set! (-> obj-test dec) #x00f0f0f0) (set! (-> obj-test flt) 123.456) - (expect (-> obj-test dec-overlay) #x00f0f0f0) + (expect-eq (-> obj-test dec-overlay) #x00f0f0f0) ;((-> struct-type methods 3) obj-test) ) @@ -46,11 +36,11 @@ ) -(let ((obj000 (new-type-hack type000)) - (bo (new-type-hack basic-type)) +(let ((obj000 (new 'global 'type000)) + (bo (new 'global 'basic-type)) ) (set! (-> obj000 x) bo) - (expect (-> obj000 x type) basic-type) + (expect-eq (-> obj000 x type) basic-type) ) @@ -63,18 +53,17 @@ ) -(let ((obj001 (new-type-hack type001)) - (sub-obj (new-type-hack struct-type))) +(let ((obj001 (new 'global 'type001)) + (sub-obj (new 'global 'struct-type))) ;;(inspect obj001) (set! (-> obj001 x) sub-obj) (set! (-> obj001 x dec) 12) - (expect 12 (-> sub-obj dec)) + (expect-eq 12 (-> sub-obj dec)) ;(inspect obj001) ;((-> struct-type methods 3) (-> obj001 x)) ) +;; todo - test the other 6 (or maybe 4?) types? -;;;;;; TEST 010 -;; no value, yes array, no inline -18 \ No newline at end of file +(finish-test) \ No newline at end of file diff --git a/goal_src/test/test-type-type.gc b/goal_src/test/test-type-type.gc new file mode 100644 index 0000000000..8b7022b77f --- /dev/null +++ b/goal_src/test/test-type-type.gc @@ -0,0 +1,2 @@ +(format #t "~A~A~%" (type-type? type structure) (type-type? type integer)) +0 \ No newline at end of file diff --git a/goalc/compiler/Compiler.cpp b/goalc/compiler/Compiler.cpp index 7c45a5824d..66eeb00f3d 100644 --- a/goalc/compiler/Compiler.cpp +++ b/goalc/compiler/Compiler.cpp @@ -152,12 +152,6 @@ void Compiler::color_object_file(FileEnv* env) { input.debug_instruction_names.push_back(i->print()); } - // temp hack - { - for (auto& arg : f->params) { - input.instructions.front().write.push_back(arg.second->ireg()); - } - } input.max_vars = f->max_vars(); input.constraints = f->constraints(); diff --git a/goalc/compiler/Compiler.h b/goalc/compiler/Compiler.h index cebdc0dabe..56d4b46281 100644 --- a/goalc/compiler/Compiler.h +++ b/goalc/compiler/Compiler.h @@ -65,6 +65,8 @@ class Compiler { const std::unordered_map>>& named); std::string as_string(const goos::Object& o); std::string symbol_string(const goos::Object& o); + std::string quoted_sym_as_string(const goos::Object& o); + bool is_basic(const TypeSpec& ts); const goos::Object& pair_car(const goos::Object& o); const goos::Object& pair_cdr(const goos::Object& o); void expect_empty_list(const goos::Object& o); @@ -79,7 +81,8 @@ class Compiler { Val* compile_real_function_call(const goos::Object& form, RegVal* function, const std::vector& args, - Env* env); + Env* env, + const std::string& method_type_name = ""); TypeSystem m_ts; std::unique_ptr m_global_env = nullptr; @@ -108,6 +111,7 @@ class Compiler { RegVal* compile_get_method_of_type(const TypeSpec& type, const std::string& method_name, Env* env); + RegVal* compile_get_method_of_object(RegVal* object, const std::string& method_name, Env* env); public: // Atoms @@ -162,6 +166,7 @@ class Compiler { Val* compile_lognot(const goos::Object& form, const goos::Object& rest, Env* env); Val* compile_logand(const goos::Object& form, const goos::Object& rest, Env* env); Val* compile_logior(const goos::Object& form, const goos::Object& rest, Env* env); + Val* compile_pointer_add(const goos::Object& form, const goos::Object& rest, Env* env); // Function Val* compile_lambda(const goos::Object& form, const goos::Object& rest, Env* env); @@ -172,6 +177,14 @@ class Compiler { Val* compile_deftype(const goos::Object& form, const goos::Object& rest, Env* env); Val* compile_defmethod(const goos::Object& form, const goos::Object& rest, Env* env); Val* compile_deref(const goos::Object& form, const goos::Object& rest, Env* env); + Val* compile_the_as(const goos::Object& form, const goos::Object& rest, Env* env); + Val* compile_the(const goos::Object& form, const goos::Object& rest, Env* env); + Val* compile_print_type(const goos::Object& form, const goos::Object& rest, Env* env); + Val* compile_new(const goos::Object& form, const goos::Object& rest, Env* env); + Val* compile_car(const goos::Object& form, const goos::Object& rest, Env* env); + Val* compile_cdr(const goos::Object& form, const goos::Object& rest, Env* env); + Val* compile_method(const goos::Object& form, const goos::Object& rest, Env* env); + Val* compile_addr_of(const goos::Object& form, const goos::Object& rest, Env* env); }; #endif // JAK_COMPILER_H diff --git a/goalc/compiler/CompilerSettings.cpp b/goalc/compiler/CompilerSettings.cpp index eec56ac010..edf55be4ce 100644 --- a/goalc/compiler/CompilerSettings.cpp +++ b/goalc/compiler/CompilerSettings.cpp @@ -9,6 +9,8 @@ CompilerSettings::CompilerSettings() { m_settings["disable-math-const-prop"].kind = SettingKind::BOOL; m_settings["disable-math-const-prop"].boolp = &disable_math_const_prop; + + link(print_timing, "print-timing"); } void CompilerSettings::set(const std::string& name, const goos::Object& value) { @@ -21,4 +23,9 @@ void CompilerSettings::set(const std::string& name, const goos::Object& value) { if (kv->second.boolp) { *kv->second.boolp = !(value.is_symbol() && value.as_symbol()->name == "#f"); } +} + +void CompilerSettings::link(bool& val, const std::string& name) { + m_settings[name].kind = SettingKind::BOOL; + m_settings[name].boolp = &val; } \ No newline at end of file diff --git a/goalc/compiler/CompilerSettings.h b/goalc/compiler/CompilerSettings.h index caecf4e179..634e189f61 100644 --- a/goalc/compiler/CompilerSettings.h +++ b/goalc/compiler/CompilerSettings.h @@ -14,10 +14,12 @@ class CompilerSettings { bool debug_print_regalloc = false; bool disable_math_const_prop = false; bool emit_move_after_return = true; + bool print_timing = false; void set(const std::string& name, const goos::Object& value); private: + void link(bool& val, const std::string& name); enum class SettingKind { BOOL, INVALID }; struct SettingsEntry { diff --git a/goalc/compiler/Env.cpp b/goalc/compiler/Env.cpp index 1e2b5ebd0a..d6974dcfe3 100644 --- a/goalc/compiler/Env.cpp +++ b/goalc/compiler/Env.cpp @@ -39,12 +39,12 @@ BlockEnv* Env::find_block(const std::string& name) { return m_parent->find_block(name); } -RegVal* Env::make_gpr(TypeSpec ts) { - return make_ireg(std::move(ts), emitter::RegKind::GPR); +RegVal* Env::make_gpr(const TypeSpec& ts) { + return make_ireg(coerce_to_reg_type(ts), emitter::RegKind::GPR); } -RegVal* Env::make_xmm(TypeSpec ts) { - return make_ireg(std::move(ts), emitter::RegKind::XMM); +RegVal* Env::make_xmm(const TypeSpec& ts) { + return make_ireg(coerce_to_reg_type(ts), emitter::RegKind::XMM); } std::unordered_map& Env::get_label_map() { @@ -233,7 +233,7 @@ RegVal* FunctionEnv::make_ireg(TypeSpec ts, emitter::RegKind kind) { IRegister ireg; ireg.kind = kind; ireg.id = m_iregs.size(); - auto rv = std::make_unique(ireg, ts); + auto rv = std::make_unique(ireg, coerce_to_reg_type(ts)); m_iregs.push_back(std::move(rv)); assert(kind != emitter::RegKind::INVALID); return m_iregs.back().get(); diff --git a/goalc/compiler/Env.h b/goalc/compiler/Env.h index a1f5a822ec..4e920357e8 100644 --- a/goalc/compiler/Env.h +++ b/goalc/compiler/Env.h @@ -36,8 +36,8 @@ class Env { virtual RegVal* lexical_lookup(goos::Object sym); virtual BlockEnv* find_block(const std::string& name); virtual std::unordered_map& get_label_map(); - RegVal* make_gpr(TypeSpec ts); - RegVal* make_xmm(TypeSpec ts); + RegVal* make_gpr(const TypeSpec& ts); + RegVal* make_xmm(const TypeSpec& ts); virtual ~Env() = default; Env* parent() { return m_parent; } diff --git a/goalc/compiler/IR.cpp b/goalc/compiler/IR.cpp index 24d59fcae1..f5594b599a 100644 --- a/goalc/compiler/IR.cpp +++ b/goalc/compiler/IR.cpp @@ -287,6 +287,7 @@ std::string IR_FunctionCall::print() { RegAllocInstr IR_FunctionCall::to_rai() { RegAllocInstr rai; rai.read.push_back(m_func->ireg()); + rai.write.push_back(m_func->ireg()); // todo, can we avoid this? rai.write.push_back(m_ret->ireg()); for (auto& arg : m_args) { rai.read.push_back(arg->ireg()); @@ -299,8 +300,6 @@ RegAllocInstr IR_FunctionCall::to_rai() { } } - // todo, clobber call reg? - return rai; } @@ -326,6 +325,7 @@ void IR_FunctionCall::do_codegen(emitter::ObjectGenerator* gen, auto freg = get_reg(m_func, allocs, irec); gen->add_instr(IGen::add_gpr64_gpr64(freg, emitter::gRegInfo.get_offset_reg()), irec); gen->add_instr(IGen::call_r64(freg), irec); + // todo, can we do a sub to undo the modification to the register? does that actually work? } ///////////////////// @@ -508,6 +508,10 @@ std::string IR_FloatMath::print() { return fmt::format("divss {}, {}", m_dest->print(), m_arg->print()); case FloatMathKind::MUL_SS: return fmt::format("mulss {}, {}", m_dest->print(), m_arg->print()); + case FloatMathKind::ADD_SS: + return fmt::format("addss {}, {}", m_dest->print(), m_arg->print()); + case FloatMathKind::SUB_SS: + return fmt::format("subss {}, {}", m_dest->print(), m_arg->print()); default: throw std::runtime_error("Unsupported FloatMathKind"); } @@ -533,6 +537,14 @@ void IR_FloatMath::do_codegen(emitter::ObjectGenerator* gen, gen->add_instr( IGen::mulss_xmm_xmm(get_reg(m_dest, allocs, irec), get_reg(m_arg, allocs, irec)), irec); break; + case FloatMathKind::ADD_SS: + gen->add_instr( + IGen::addss_xmm_xmm(get_reg(m_dest, allocs, irec), get_reg(m_arg, allocs, irec)), irec); + break; + case FloatMathKind::SUB_SS: + gen->add_instr( + IGen::subss_xmm_xmm(get_reg(m_dest, allocs, irec), get_reg(m_arg, allocs, irec)), irec); + break; default: assert(false); } @@ -664,7 +676,9 @@ void IR_ConditionalBranch::do_codegen(emitter::ObjectGenerator* gen, } if (condition.is_float) { - assert(false); // for now + gen->add_instr( + IGen::cmp_flt_flt(get_reg(condition.a, allocs, irec), get_reg(condition.b, allocs, irec)), + irec); } else { gen->add_instr(IGen::cmp_gpr64_gpr64(get_reg(condition.a, allocs, irec), get_reg(condition.b, allocs, irec)), @@ -686,7 +700,7 @@ IR_LoadConstOffset::IR_LoadConstOffset(const RegVal* dest, : m_dest(dest), m_offset(offset), m_base(base), m_info(info) {} std::string IR_LoadConstOffset::print() { - return fmt::format("mov {}, [{} + {}]\n", m_dest->print(), m_base->print(), m_offset); + return fmt::format("mov {}, [{} + {}]", m_dest->print(), m_base->print(), m_offset); } RegAllocInstr IR_LoadConstOffset::to_rai() { @@ -707,4 +721,134 @@ void IR_LoadConstOffset::do_codegen(emitter::ObjectGenerator* gen, } else { throw std::runtime_error("IR_LoadConstOffset::do_codegen xmm not supported"); } +} + +/////////////////////// +// StoreConstantOffset +/////////////////////// +IR_StoreConstOffset::IR_StoreConstOffset(const RegVal* value, + int offset, + const RegVal* base, + int size) + : m_value(value), m_offset(offset), m_base(base), m_size(size) {} + +std::string IR_StoreConstOffset::print() { + return fmt::format("move [{} + {}], {}", m_base->print(), m_offset, m_value->print()); +} + +RegAllocInstr IR_StoreConstOffset::to_rai() { + RegAllocInstr rai; + rai.read.push_back(m_value->ireg()); + rai.read.push_back(m_base->ireg()); + return rai; +} + +void IR_StoreConstOffset::do_codegen(emitter::ObjectGenerator* gen, + const AllocationResult& allocs, + emitter::IR_Record irec) { + if (m_value->ireg().kind == emitter::RegKind::GPR) { + gen->add_instr( + IGen::store_goal_gpr(get_reg(m_base, allocs, irec), get_reg(m_value, allocs, irec), + emitter::gRegInfo.get_offset_reg(), m_offset, m_size), + irec); + } else if (m_value->ireg().kind == emitter::RegKind::XMM && m_size == 4) { + gen->add_instr( + IGen::store_goal_xmm32(get_reg(m_base, allocs, irec), get_reg(m_value, allocs, irec), + emitter::gRegInfo.get_offset_reg(), m_offset), + irec); + } else { + throw std::runtime_error("IR_StoreConstOffset::do_codegen can't handle this"); + } +} + +/////////////////////// +// Null +/////////////////////// +std::string IR_Null::print() { + return "null"; +} + +RegAllocInstr IR_Null::to_rai() { + return {}; +} + +void IR_Null::do_codegen(emitter::ObjectGenerator* gen, + const AllocationResult& allocs, + emitter::IR_Record irec) { + (void)gen; + (void)allocs; + (void)irec; +} + +/////////////////////// +// FunctionStart +/////////////////////// +IR_FunctionStart::IR_FunctionStart(std::vector args) : m_args(std::move(args)) {} + +std::string IR_FunctionStart::print() { + return "function-start"; +} + +RegAllocInstr IR_FunctionStart::to_rai() { + RegAllocInstr rai; + for (auto& x : m_args) { + rai.write.push_back(x->ireg()); + } + return rai; +} + +void IR_FunctionStart::do_codegen(emitter::ObjectGenerator* gen, + const AllocationResult& allocs, + emitter::IR_Record irec) { + (void)gen; + (void)allocs; + (void)irec; +} + +/////////////////////// +// FloatToInt +/////////////////////// + +IR_FloatToInt::IR_FloatToInt(const RegVal* dest, const RegVal* src) : m_dest(dest), m_src(src) {} + +std::string IR_FloatToInt::print() { + return fmt::format("f2i {}, {}", m_dest->print(), m_src->print()); +} + +RegAllocInstr IR_FloatToInt::to_rai() { + RegAllocInstr rai; + rai.read.push_back(m_src->ireg()); + rai.write.push_back(m_dest->ireg()); + return rai; +} + +void IR_FloatToInt::do_codegen(emitter::ObjectGenerator* gen, + const AllocationResult& allocs, + emitter::IR_Record irec) { + gen->add_instr(IGen::float_to_int32(get_reg(m_dest, allocs, irec), get_reg(m_src, allocs, irec)), + irec); +} + +/////////////////////// +// IntToFloat +/////////////////////// + +IR_IntToFloat::IR_IntToFloat(const RegVal* dest, const RegVal* src) : m_dest(dest), m_src(src) {} + +std::string IR_IntToFloat::print() { + return fmt::format("i2f {}, {}", m_dest->print(), m_src->print()); +} + +RegAllocInstr IR_IntToFloat::to_rai() { + RegAllocInstr rai; + rai.read.push_back(m_src->ireg()); + rai.write.push_back(m_dest->ireg()); + return rai; +} + +void IR_IntToFloat::do_codegen(emitter::ObjectGenerator* gen, + const AllocationResult& allocs, + emitter::IR_Record irec) { + gen->add_instr(IGen::int32_to_float(get_reg(m_dest, allocs, irec), get_reg(m_src, allocs, irec)), + irec); } \ No newline at end of file diff --git a/goalc/compiler/IR.h b/goalc/compiler/IR.h index c49221feb5..5a04c683ef 100644 --- a/goalc/compiler/IR.h +++ b/goalc/compiler/IR.h @@ -223,7 +223,7 @@ class IR_IntegerMath : public IR { RegVal* m_arg; }; -enum class FloatMathKind { DIV_SS, MUL_SS }; +enum class FloatMathKind { DIV_SS, MUL_SS, ADD_SS, SUB_SS }; class IR_FloatMath : public IR { public: @@ -286,4 +286,71 @@ class IR_LoadConstOffset : public IR { MemLoadInfo m_info; }; +class IR_StoreConstOffset : public IR { + public: + IR_StoreConstOffset(const RegVal* value, int offset, const RegVal* base, int size); + std::string print() override; + RegAllocInstr to_rai() override; + void do_codegen(emitter::ObjectGenerator* gen, + const AllocationResult& allocs, + emitter::IR_Record irec) override; + + private: + const RegVal* m_value = nullptr; + int m_offset = 0; + const RegVal* m_base = nullptr; + int m_size = 0; +}; + +class IR_Null : public IR { + public: + IR_Null() = default; + std::string print() override; + RegAllocInstr to_rai() override; + void do_codegen(emitter::ObjectGenerator* gen, + const AllocationResult& allocs, + emitter::IR_Record irec) override; +}; + +class IR_FunctionStart : public IR { + public: + IR_FunctionStart(std::vector args); + std::string print() override; + RegAllocInstr to_rai() override; + void do_codegen(emitter::ObjectGenerator* gen, + const AllocationResult& allocs, + emitter::IR_Record irec) override; + + private: + std::vector m_args; +}; + +class IR_FloatToInt : public IR { + public: + IR_FloatToInt(const RegVal* dest, const RegVal* src); + std::string print() override; + RegAllocInstr to_rai() override; + void do_codegen(emitter::ObjectGenerator* gen, + const AllocationResult& allocs, + emitter::IR_Record irec) override; + + private: + const RegVal* m_dest = nullptr; + const RegVal* m_src = nullptr; +}; + +class IR_IntToFloat : public IR { + public: + IR_IntToFloat(const RegVal* dest, const RegVal* src); + std::string print() override; + RegAllocInstr to_rai() override; + void do_codegen(emitter::ObjectGenerator* gen, + const AllocationResult& allocs, + emitter::IR_Record irec) override; + + private: + const RegVal* m_dest = nullptr; + const RegVal* m_src = nullptr; +}; + #endif // JAK_IR_H diff --git a/goalc/compiler/StaticObject.cpp b/goalc/compiler/StaticObject.cpp index dd0ef92add..cdd6be0641 100644 --- a/goalc/compiler/StaticObject.cpp +++ b/goalc/compiler/StaticObject.cpp @@ -40,7 +40,7 @@ void StaticString::generate(emitter::ObjectGenerator* gen) { } // add allocated size - push_data_to_byte_vector(text.size() + 1, d); + push_data_to_byte_vector(text.size(), d); // add chars for (auto c : text) { diff --git a/goalc/compiler/Util.cpp b/goalc/compiler/Util.cpp index 7c1b7c722a..0c37525b47 100644 --- a/goalc/compiler/Util.cpp +++ b/goalc/compiler/Util.cpp @@ -104,6 +104,15 @@ std::string Compiler::symbol_string(const goos::Object& o) { return o.as_symbol()->name; } +std::string Compiler::quoted_sym_as_string(const goos::Object& o) { + auto args = get_va(o, o); + va_check(o, args, {{goos::ObjectType::SYMBOL}, {goos::ObjectType::SYMBOL}}, {}); + if (symbol_string(args.unnamed.at(0)) != "quote") { + throw_compile_error(o, "invalid quoted symbol " + o.print()); + } + return symbol_string(args.unnamed.at(1)); +} + const goos::Object& Compiler::pair_car(const goos::Object& o) { return o.as_pair()->car; } @@ -171,4 +180,8 @@ emitter::RegKind Compiler::get_preferred_reg_kind(const TypeSpec& ts) { bool Compiler::is_none(Val* in) { return dynamic_cast(in); +} + +bool Compiler::is_basic(const TypeSpec& ts) { + return m_ts.typecheck(m_ts.make_typespec("basic"), ts, "", false, false); } \ No newline at end of file diff --git a/goalc/compiler/Val.cpp b/goalc/compiler/Val.cpp index 8ad1b10060..7160dffc37 100644 --- a/goalc/compiler/Val.cpp +++ b/goalc/compiler/Val.cpp @@ -11,7 +11,7 @@ RegVal* Val::to_gpr(Env* fe) { if (rv->ireg().kind == emitter::RegKind::GPR) { return rv; } else { - auto re = fe->make_gpr(m_ts); + auto re = fe->make_gpr(coerce_to_reg_type(m_ts)); fe->emit(std::make_unique(re, rv)); return re; } @@ -39,7 +39,7 @@ RegVal* RegVal::to_gpr(Env* fe) { if (m_ireg.kind == emitter::RegKind::GPR) { return this; } else { - auto re = fe->make_gpr(m_ts); + auto re = fe->make_gpr(coerce_to_reg_type(m_ts)); fe->emit(std::make_unique(re, this)); return re; } @@ -50,64 +50,105 @@ RegVal* RegVal::to_xmm(Env* fe) { if (m_ireg.kind == emitter::RegKind::XMM) { return this; } else { - auto re = fe->make_xmm(m_ts); + auto re = fe->make_xmm(coerce_to_reg_type(m_ts)); fe->emit(std::make_unique(re, this)); return re; } } RegVal* IntegerConstantVal::to_reg(Env* fe) { - auto rv = fe->make_gpr(m_ts); + auto rv = fe->make_gpr(coerce_to_reg_type(m_ts)); fe->emit(std::make_unique(rv, m_value)); return rv; } RegVal* SymbolVal::to_reg(Env* fe) { - auto re = fe->make_gpr(m_ts); + auto re = fe->make_gpr(coerce_to_reg_type(m_ts)); fe->emit(std::make_unique(re, m_name)); return re; } RegVal* SymbolValueVal::to_reg(Env* fe) { - auto re = fe->make_gpr(m_ts); + auto re = fe->make_gpr(coerce_to_reg_type(m_ts)); fe->emit(std::make_unique(re, m_sym, m_sext)); return re; } RegVal* StaticVal::to_reg(Env* fe) { - auto re = fe->make_gpr(m_ts); + auto re = fe->make_gpr(coerce_to_reg_type(m_ts)); fe->emit(std::make_unique(re, obj)); return re; } RegVal* LambdaVal::to_reg(Env* fe) { - auto re = fe->make_gpr(m_ts); + auto re = fe->make_gpr(coerce_to_reg_type(m_ts)); assert(func); fe->emit(std::make_unique(re, func)); return re; } +RegVal* InlinedLambdaVal::to_reg(Env* fe) { + throw std::runtime_error("Cannot put InlinedLambdaVal in a register."); + return lv->to_reg(fe); +} + RegVal* FloatConstantVal::to_reg(Env* fe) { - auto re = fe->make_xmm(m_ts); + auto re = fe->make_xmm(coerce_to_reg_type(m_ts)); fe->emit(std::make_unique(re, m_value)); return re; } RegVal* MemoryOffsetConstantVal::to_reg(Env* fe) { - (void)fe; - assert(false); - throw std::runtime_error("MemoryOffsetConstantVal::to_reg not yet implemented"); + auto re = fe->make_gpr(coerce_to_reg_type(m_ts)); + fe->emit(std::make_unique(re, int64_t(offset))); + fe->emit(std::make_unique(IntegerMathKind::ADD_64, re, base->to_gpr(fe))); + return re; +} + +RegVal* MemoryOffsetVal::to_reg(Env* fe) { + auto re = fe->make_gpr(coerce_to_reg_type(m_ts)); + fe->emit(std::make_unique(re, offset->to_gpr(fe))); + fe->emit(std::make_unique(IntegerMathKind::ADD_64, re, base->to_gpr(fe))); + return re; } RegVal* MemoryDerefVal::to_reg(Env* fe) { auto base_as_co = dynamic_cast(base); if (base_as_co) { - auto re = fe->make_gpr(m_ts); + auto re = fe->make_gpr(coerce_to_reg_type(m_ts)); fe->emit(std::make_unique(re, base_as_co->offset, base_as_co->base->to_gpr(fe), info)); return re; } else { - assert(false); - throw std::runtime_error("MemoryDerefVal::to_reg not yet implemented for this case"); + auto re = fe->make_gpr(coerce_to_reg_type(m_ts)); + auto addr = base->to_gpr(fe); + fe->emit(std::make_unique(re, 0, addr, info)); + return re; } +} + +RegVal* AliasVal::to_reg(Env* fe) { + auto as_old_type = base->to_reg(fe); + auto result = fe->make_ireg(m_ts, as_old_type->ireg().kind); + fe->emit(std::make_unique(result, as_old_type)); + return result; +} + +std::string PairEntryVal::print() const { + if (is_car) { + return fmt::format("[car of {}]", base->print()); + } else { + return fmt::format("[cdr of {}]", base->print()); + } +} + +RegVal* PairEntryVal::to_reg(Env* fe) { + int offset = is_car ? -2 : 2; + auto re = fe->make_gpr(coerce_to_reg_type(m_ts)); + MemLoadInfo info; + info.reg = RegKind::GPR_64; + info.sign_extend = true; + info.size = 4; + fe->emit(std::make_unique(re, offset, base->to_gpr(fe), info)); + return re; } \ No newline at end of file diff --git a/goalc/compiler/Val.h b/goalc/compiler/Val.h index ebb3ae2db0..67fe8874eb 100644 --- a/goalc/compiler/Val.h +++ b/goalc/compiler/Val.h @@ -44,9 +44,12 @@ class Val { const TypeSpec& type() const { return m_ts; } void set_type(TypeSpec ts) { m_ts = std::move(ts); } + bool settable() const { return m_is_settable; } + void mark_as_settable() { m_is_settable = true; } protected: TypeSpec m_ts; + bool m_is_settable = false; }; /*! @@ -64,7 +67,7 @@ class None : public Val { */ class RegVal : public Val { public: - RegVal(IRegister ireg, TypeSpec ts) : Val(std::move(ts)), m_ireg(ireg) {} + RegVal(IRegister ireg, const TypeSpec& ts) : Val(coerce_to_reg_type(ts)), m_ireg(ireg) {} bool is_register() const override { return true; } IRegister ireg() const override { return m_ireg; } std::string print() const override { return m_ireg.to_string(); }; @@ -82,7 +85,9 @@ class RegVal : public Val { */ class SymbolVal : public Val { public: - SymbolVal(std::string name, TypeSpec ts) : Val(std::move(ts)), m_name(std::move(name)) {} + SymbolVal(std::string name, TypeSpec ts) : Val(std::move(ts)), m_name(std::move(name)) { + mark_as_settable(); + } const std::string& name() const { return m_name; } std::string print() const override { return "<" + m_name + ">"; } RegVal* to_reg(Env* fe) override; @@ -117,6 +122,14 @@ class LambdaVal : public Val { RegVal* to_reg(Env* fe) override; }; +class InlinedLambdaVal : public Val { + public: + explicit InlinedLambdaVal(TypeSpec ts, LambdaVal* _lv) : Val(std::move(ts)), lv(_lv) {} + std::string print() const override { return "inline-lambda-" + lv->lambda.debug_name; } + LambdaVal* lv = nullptr; + RegVal* to_reg(Env* fe) override; +}; + class StaticVal : public Val { public: StaticVal(StaticObject* _obj, TypeSpec _ts) : Val(std::move(_ts)), obj(_obj) {} @@ -152,6 +165,16 @@ class MemoryOffsetConstantVal : public Val { int offset = 0; }; +class MemoryOffsetVal : public Val { + public: + MemoryOffsetVal(TypeSpec ts, Val* _base, Val* _offset) + : Val(std::move(ts)), base(_base), offset(_offset) {} + std::string print() const override { return "(" + base->print() + " + " + offset->print() + ")"; } + RegVal* to_reg(Env* fe) override; + Val* base = nullptr; + Val* offset = nullptr; +}; + // MemOffConstant // MemOffVar @@ -165,8 +188,23 @@ class MemoryDerefVal : public Val { MemLoadInfo info; }; -// PairEntry -// Alias +class PairEntryVal : public Val { + public: + PairEntryVal(TypeSpec ts, Val* _base, bool _is_car) + : Val(std::move(ts)), base(_base), is_car(_is_car) {} + std::string print() const override; + RegVal* to_reg(Env* fe) override; + Val* base = nullptr; + bool is_car = false; +}; + +class AliasVal : public Val { + public: + AliasVal(TypeSpec ts, Val* _base) : Val(std::move(ts)), base(_base) {} + std::string print() const override { return "alias-of-" + base->print(); } + RegVal* to_reg(Env* fe) override; + Val* base = nullptr; +}; class IntegerConstantVal : public Val { public: diff --git a/goalc/compiler/compilation/Atoms.cpp b/goalc/compiler/compilation/Atoms.cpp index 24123e4362..b47d0c12d9 100644 --- a/goalc/compiler/compilation/Atoms.cpp +++ b/goalc/compiler/compilation/Atoms.cpp @@ -1,6 +1,6 @@ /*! * @file Atoms.cpp - * Compiler implementation for atoms - things which aren't compound forms. + * Top-level compilation forms for each of the GOOS object types. */ #include "goalc/compiler/Compiler.h" @@ -20,81 +20,69 @@ static const std::unordered_map< // {".jmp", &Compiler::compile_asm}, // {".sub", &Compiler::compile_asm}, // {".ret-reg", &Compiler::compile_asm}, - // - // // BLOCK FORMS + + // BLOCK FORMS {"top-level", &Compiler::compile_top_level}, {"begin", &Compiler::compile_begin}, {"block", &Compiler::compile_block}, {"return-from", &Compiler::compile_return_from}, {"label", &Compiler::compile_label}, {"goto", &Compiler::compile_goto}, - // - // // COMPILER CONTROL + + // COMPILER CONTROL {"gs", &Compiler::compile_gs}, {":exit", &Compiler::compile_exit}, {"asm-file", &Compiler::compile_asm_file}, {"listen-to-target", &Compiler::compile_listen_to_target}, {"reset-target", &Compiler::compile_reset_target}, {":status", &Compiler::compile_poke}, - // {"test", &Compiler::compile_test}, {"in-package", &Compiler::compile_in_package}, - // - // // CONDITIONAL COMPILATION + + // CONDITIONAL COMPILATION {"#cond", &Compiler::compile_gscond}, {"defglobalconstant", &Compiler::compile_defglobalconstant}, {"seval", &Compiler::compile_seval}, - // - // // CONTROL FLOW + + // CONTROL FLOW {"cond", &Compiler::compile_cond}, {"when-goto", &Compiler::compile_when_goto}, - // - // // DEFINITION + + // DEFINITION {"define", &Compiler::compile_define}, {"define-extern", &Compiler::compile_define_extern}, {"set!", &Compiler::compile_set}, - // {"defun-extern", &Compiler::compile_defun_extern}, - // {"declare-method", &Compiler::compile_declare_method}, - // + // TYPE {"deftype", &Compiler::compile_deftype}, {"defmethod", &Compiler::compile_defmethod}, // {"defenum", &Compiler::compile_defenum}, {"->", &Compiler::compile_deref}, - // {"&", &Compiler::compile_addr_of}, - // - // - // // LAMBDA + {"&", &Compiler::compile_addr_of}, + {"the-as", &Compiler::compile_the_as}, + {"the", &Compiler::compile_the}, + {"print-type", &Compiler::compile_print_type}, + {"new", &Compiler::compile_new}, + {"car", &Compiler::compile_car}, + {"cdr", &Compiler::compile_cdr}, + {"method", &Compiler::compile_method}, + + // LAMBDA {"lambda", &Compiler::compile_lambda}, {"declare", &Compiler::compile_declare}, {"inline", &Compiler::compile_inline}, // {"with-inline", &Compiler::compile_with_inline}, // {"rlet", &Compiler::compile_rlet}, // {"get-ra-ptr", &Compiler::compile_get_ra_ptr}, - // - // - // - // // MACRO - // {"print-type", &Compiler::compile_print_type}, + + // MACRO {"quote", &Compiler::compile_quote}, {"mlet", &Compiler::compile_mlet}, // {"defconstant", &Compiler::compile_defconstant}, - // - // // OBJECT - // - // {"the", &Compiler::compile_the}, - // {"the-as", &Compiler::compile_the_as}, - // - // - // + + // OBJECT // {"current-method-type", &Compiler::compile_current_method_type}, - // {"new", &Compiler::compile_new}, - // {"method", &Compiler::compile_method}, - // - // // PAIR - // {"car", &Compiler::compile_car}, - // {"cdr", &Compiler::compile_cdr}, - // - // // IT IS MATH + + // MATH {"+", &Compiler::compile_add}, {"-", &Compiler::compile_sub}, {"*", &Compiler::compile_mul}, @@ -118,16 +106,13 @@ static const std::unordered_map< {">=", &Compiler::compile_condition_as_bool}, {"<", &Compiler::compile_condition_as_bool}, {">", &Compiler::compile_condition_as_bool}, - // - // // BUILDER (build-dgo/build-cgo?) - {"build-dgos", &Compiler::compile_build_dgo}, - // - // // UTIL - {"set-config!", &Compiler::compile_set_config}, + {"&+", &Compiler::compile_pointer_add}, - // - // // temporary testing hacks... - // {"send-test", &Compiler::compile_send_test_data}, + // BUILDER (build-dgo/build-cgo?) + {"build-dgos", &Compiler::compile_build_dgo}, + + // UTIL + {"set-config!", &Compiler::compile_set_config}, }; /*! @@ -151,6 +136,12 @@ Val* Compiler::compile(const goos::Object& code, Env* env) { return get_none(); } +/*! + * Compile a pair/list. + * Can be a compiler form, function call (possibly inlined), method call, immediate application of a + * lambda, or a goos macro. + * TODO - enums. + */ Val* Compiler::compile_pair(const goos::Object& code, Env* env) { auto pair = code.as_pair(); auto head = pair->car; @@ -164,41 +155,80 @@ Val* Compiler::compile_pair(const goos::Object& code, Env* env) { return ((*this).*(kv_gfs->second))(code, rest, env); } + // next try as a macro goos::Object macro_obj; if (try_getting_macro_from_goos(head, ¯o_obj)) { return compile_goos_macro(code, macro_obj, rest, env); } - // todo enum + // try as an enum (not yet implemented) } - // todo function or method call + // if none of the above cases worked, then treat it like a function/method call. return compile_function_or_method_call(code, env); - // throw_compile_error(code, "Unrecognized symbol at head of form"); - // return nullptr; } +/*! + * Compile an integer constant. Returns an IntegerConstantVal and emits no code. + * These integer constants do not generate static data and are stored directly in the code + * which is generated with to_gpr. + * The type is always int. + */ Val* Compiler::compile_integer(const goos::Object& code, Env* env) { + assert(code.is_int()); return compile_integer(code.integer_obj.value, env); } +/*! + * Compile an integer constant. Returns an IntegerConstantVal and emits no code. + * These integer constants do not generate static data and are stored directly in the code + * which is generated with to_gpr. + * The type is always int. + */ Val* Compiler::compile_integer(s64 value, Env* env) { auto fe = get_parent_env_of_type(env); return fe->alloc_val(m_ts.make_typespec("int"), value); } +/*! + * Get a SymbolVal representing a GOAL symbol object. + */ SymbolVal* Compiler::compile_get_sym_obj(const std::string& name, Env* env) { auto fe = get_parent_env_of_type(env); return fe->alloc_val(name, m_ts.make_typespec("symbol")); } +/*! + * Get a SymbolValueVal representing the value of a GOAL symbol. + * Will throw a compilation error if the symbol wasn't previously defined. + * TODO - determine sign extension behavior when loading symbol values. + */ +Val* Compiler::compile_get_symbol_value(const std::string& name, Env* env) { + auto existing_symbol = m_symbol_types.find(name); + if (existing_symbol == m_symbol_types.end()) { + throw std::runtime_error("The symbol " + name + " was not defined"); + } + + auto ts = existing_symbol->second; + auto sext = m_ts.lookup_type(ts)->get_load_signed(); + auto fe = get_parent_env_of_type(env); + auto sym = fe->alloc_val(name, m_ts.make_typespec("symbol")); + auto re = fe->alloc_val(sym, ts, sext); + return re; +} + +/*! + * Compile a symbol. Can get mlet macro symbols, local variables, constants, or symbols. + */ Val* Compiler::compile_symbol(const goos::Object& form, Env* env) { auto name = symbol_string(form); + // special case to get "nothing", used as a return value when nothing should be returned. if (name == "none") { return get_none(); } + // see if the symbol is defined in any enclosing symbol macro envs (mlet's). auto mlet_env = get_parent_env_of_type(env); while (mlet_env) { auto mlkv = mlet_env->macros.find(form.as_symbol()); @@ -208,6 +238,7 @@ Val* Compiler::compile_symbol(const goos::Object& form, Env* env) { mlet_env = get_parent_env_of_type(mlet_env->parent()); } + // see if it's a local variable auto lexical = env->lexical_lookup(form); if (lexical) { return lexical; @@ -216,6 +247,7 @@ Val* Compiler::compile_symbol(const goos::Object& form, Env* env) { auto global_constant = m_global_constants.find(form.as_symbol()); auto existing_symbol = m_symbol_types.find(form.as_symbol()->name); + // see if it's a constant if (global_constant != m_global_constants.end()) { // check there is no symbol with the same name if (existing_symbol != m_symbol_types.end()) { @@ -228,28 +260,21 @@ Val* Compiler::compile_symbol(const goos::Object& form, Env* env) { return compile_error_guard(global_constant->second, env); } + // none of those, so get a global symbol. return compile_get_symbol_value(name, env); } -Val* Compiler::compile_get_symbol_value(const std::string& name, Env* env) { - auto existing_symbol = m_symbol_types.find(name); - if (existing_symbol == m_symbol_types.end()) { - // assert(false); - throw std::runtime_error("The symbol " + name + " was not defined"); - } - - auto ts = existing_symbol->second; - auto sext = m_ts.lookup_type(ts)->get_load_signed(); - auto fe = get_parent_env_of_type(env); - auto sym = fe->alloc_val(name, m_ts.make_typespec("symbol")); - auto re = fe->alloc_val(sym, ts, sext); - return re; -} - +/*! + * Compile a string constant. The constant is placed in the same segment as the parent function. + */ Val* Compiler::compile_string(const goos::Object& form, Env* env) { - return compile_string(form.as_string()->data, env, MAIN_SEGMENT); + return compile_string(form.as_string()->data, env, + get_parent_env_of_type(env)->segment); } +/*! + * Compile a string constant and place it in the given segment. + */ Val* Compiler::compile_string(const std::string& str, Env* env, int seg) { auto obj = std::make_unique(str, seg); auto fe = get_parent_env_of_type(env); @@ -259,11 +284,22 @@ Val* Compiler::compile_string(const std::string& str, Env* env, int seg) { return result; } +/*! + * Compile a floating point constant and place it in the same segment as the containing function. + * Unlike integers, all floating point constants are stored separately as static data outside + * of the code, at least in Jak 1. + */ Val* Compiler::compile_float(const goos::Object& code, Env* env) { assert(code.is_float()); - return compile_float(code.float_obj.value, env, MAIN_SEGMENT); + return compile_float(code.float_obj.value, env, + get_parent_env_of_type(env)->segment); } +/*! + * Compile a floating point constant and place it in given segment. + * Unlike integers, all floating point constants are stored separately as static data outside + * of the code, at least in Jak 1. + */ Val* Compiler::compile_float(float value, Env* env, int seg) { auto obj = std::make_unique(value, seg); auto fe = get_parent_env_of_type(env); @@ -271,4 +307,17 @@ Val* Compiler::compile_float(float value, Env* env, int seg) { auto fie = get_parent_env_of_type(env); fie->add_static(std::move(obj)); return result; +} + +Val* Compiler::compile_pointer_add(const goos::Object& form, const goos::Object& rest, Env* env) { + auto args = get_va(form, rest); + va_check(form, args, {{}, {}}, {}); + auto first = compile_error_guard(args.unnamed.at(0), env)->to_gpr(env); + typecheck(form, m_ts.make_typespec("pointer"), first->type(), "&+ first argument"); + auto second = compile_error_guard(args.unnamed.at(1), env)->to_gpr(env); + typecheck(form, m_ts.make_typespec("integer"), second->type(), "&+ second argument"); + auto result = env->make_gpr(first->type()); + env->emit(std::make_unique(result, first)); + env->emit(std::make_unique(IntegerMathKind::ADD_64, result, second)); + return result; } \ No newline at end of file diff --git a/goalc/compiler/compilation/Block.cpp b/goalc/compiler/compilation/Block.cpp index 1db6980419..60f68beb1a 100644 --- a/goalc/compiler/compilation/Block.cpp +++ b/goalc/compiler/compilation/Block.cpp @@ -1,26 +1,50 @@ +/*! + * @file Block.cpp + * Compiler implementation for blocks / gotos / labels + */ + #include "goalc/compiler/Compiler.h" #include "goalc/compiler/IR.h" using namespace goos; +/*! + * Compile "top-level" form, which is equivalent to a begin. + */ Val* Compiler::compile_top_level(const goos::Object& form, const goos::Object& rest, Env* env) { return compile_begin(form, rest, env); } +/*! + * Compile "begin" form, which compiles each segment in a row. + * TODO - determine if a GOAL begin matches this behavior for not "to_reg"ing anything. + */ Val* Compiler::compile_begin(const goos::Object& form, const goos::Object& rest, Env* env) { (void)form; Val* result = get_none(); - for_each_in_list(rest, [&](const Object& o) { result = compile_error_guard(o, env); }); + for_each_in_list(rest, [&](const Object& o) { + result = compile_error_guard(o, env); + if (!dynamic_cast(result)) { + result = result->to_reg(env); + } + }); return result; } +/*! + * Compile "block" form. Code inside of a block can "return from" the block and provide a value + * for the block. If this doesn't happen, the block takes on the value of the last thing in + * the block. + * TODO - determine if a GOAL block matches this behavior for not "to_reg"ing anything, + * and also using a gpr as a return value always. + */ Val* Compiler::compile_block(const goos::Object& form, const goos::Object& _rest, Env* env) { auto rest = &_rest; auto name = pair_car(*rest); rest = &pair_cdr(*rest); if (!rest->is_pair()) { - throw_compile_error(form, "Block form has an empty or invliad body"); + throw_compile_error(form, "Block form has an empty or invalid body"); } auto fe = get_parent_env_of_type(env); @@ -29,9 +53,8 @@ Val* Compiler::compile_block(const goos::Object& form, const goos::Object& _rest auto block_env = fe->alloc_env(env, symbol_string(name)); // we need to create a return value register, as a "return-from" statement inside the block may - // set it. for now it has a type of none, but we will set it more accurate after compiling the - // block. - // block_env->return_value = env->alloc_reg(get_base_typespec("none")); + // set it. for now it has a type of none, but we will set it after compiling the block. + // TODO - determine if GOAL blocks _always_ return gprs, or if it's possible to return xmms. block_env->return_value = env->make_gpr(m_ts.make_typespec("none")); // create label to the end of the block (we don't yet know where it is...) @@ -39,11 +62,17 @@ Val* Compiler::compile_block(const goos::Object& form, const goos::Object& _rest // compile everything in the body Val* result = get_none(); - for_each_in_list(*rest, [&](const Object& o) { result = compile_error_guard(o, block_env); }); + for_each_in_list(*rest, [&](const Object& o) { + result = compile_error_guard(o, block_env); + if (!dynamic_cast(result)) { + result = result->to_reg(env); + } + }); // if no return-from's were used, we can ignore the return_value register, and basically turn this // into a begin. this allows a block which returns a floating point value to return the value in // an xmm register, which is likely to eliminate a gpr->xmm move. + // TODO - does this happen in GOAL? if (block_env->return_types.empty()) { return result; } @@ -53,7 +82,7 @@ Val* Compiler::compile_block(const goos::Object& form, const goos::Object& _rest auto& return_types = block_env->return_types; return_types.push_back(result->type()); auto return_type = m_ts.lowest_common_ancestor(return_types); - block_env->return_value->set_type(return_type); + block_env->return_value->set_type(coerce_to_reg_type(return_type)); // an IR to move the result of the block into the block's return register (if no return-from's are // taken) @@ -71,6 +100,11 @@ Val* Compiler::compile_block(const goos::Object& form, const goos::Object& _rest return block_env->return_value; } +/*! + * Compile a "return-from" statement. These can be used to return from a block and give a value. + * Note that there is a special "block" containing all code in a function called "#f", and you can + * use (return-from #f value) to return early from an entire function. + */ Val* Compiler::compile_return_from(const goos::Object& form, const goos::Object& _rest, Env* env) { const Object* rest = &_rest; auto block_name = symbol_string(pair_car(*rest)); @@ -97,23 +131,27 @@ Val* Compiler::compile_return_from(const goos::Object& form, const goos::Object& env->emit(std::move(ir_move_rv)); - // jump to end of block + // jump to end of block (by label object) auto ir_jump = std::make_unique(&block->end_label); - // we know this label is a real label. even though end_label doesn't know where it is, there is an - // actual label object. this means we won't try to resolve this label _by name_ later on when the - // block is done. - // ir_jump->resolved = true; env->emit(std::move(ir_jump)); - // In the real GOAL, there is likely a bug here where a non-none value is returned. + // In the real GOAL, there is likely a bug here where a non-none value is returned and to_gpr'd + // todo, determine if we should replicate this bug and if it can have side effects. return get_none(); } +/*! + * Compile a label form, which creates a named label that can be jumped to with goto. + */ Val* Compiler::compile_label(const goos::Object& form, const goos::Object& rest, Env* env) { auto label_name = symbol_string(pair_car(rest)); expect_empty_list(pair_cdr(rest)); // make sure we don't have a label with this name already + // note that you cannot jump out of your label space - they are not nested like lexical scopes! + // generally there is one label space per function. Inlined functions have their own label space + // and they will not permit jumping outside of the inlined function into the caller because + // that seems like a really bad idea. auto& labels = env->get_label_map(); auto kv = labels.find(label_name); if (kv != labels.end()) { @@ -121,12 +159,16 @@ Val* Compiler::compile_label(const goos::Object& form, const goos::Object& rest, form, "There are two labels named " + label_name + " in the same label environment"); } - // make a label pointing to the end of the current function env. + // make a label pointing to the end of the current function env. safe because we'll always add + // a terminating "null" instruction at the end. auto func_env = get_parent_env_of_type(env); labels[label_name] = Label(func_env, func_env->code().size()); return get_none(); } +/*! + * Compile a goto form, which unconditionally jumps to a label by name in the same label space. + */ Val* Compiler::compile_goto(const goos::Object& form, const goos::Object& rest, Env* env) { (void)form; auto label_name = symbol_string(pair_car(rest)); diff --git a/goalc/compiler/compilation/CompilerControl.cpp b/goalc/compiler/compilation/CompilerControl.cpp index 48113cb4a6..b2c7ea2f1b 100644 --- a/goalc/compiler/compilation/CompilerControl.cpp +++ b/goalc/compiler/compilation/CompilerControl.cpp @@ -1,9 +1,18 @@ +/*! + * @file CompilerControl.cpp + * Compiler implementation for forms which actually control the compiler. + */ + #include "goalc/compiler/Compiler.h" #include "goalc/compiler/IR.h" #include "common/util/Timer.h" #include "common/util/DgoWriter.h" #include "common/util/FileUtil.h" +/*! + * Exit the compiler. Disconnects the listener and tells the target to reset itself. + * Will actually exit the next time the REPL runs. + */ Val* Compiler::compile_exit(const goos::Object& form, const goos::Object& rest, Env* env) { (void)env; auto args = get_va(form, rest); @@ -11,10 +20,15 @@ Val* Compiler::compile_exit(const goos::Object& form, const goos::Object& rest, if (m_listener.is_connected()) { m_listener.send_reset(false); } + // flag for the REPL. m_want_exit = true; return get_none(); } +/*! + * Evaluate GOOS code. It's not possible to get the result, so this is really only useful to get + * a side effect. Used to bootstrap the GOAL/GOOS macro system. + */ Val* Compiler::compile_seval(const goos::Object& form, const goos::Object& rest, Env* env) { (void)env; try { @@ -27,6 +41,10 @@ Val* Compiler::compile_seval(const goos::Object& form, const goos::Object& rest, return get_none(); } +/*! + * Compile a file, and optionally color, save, or load. + * This should only be used for v3 "code object" files. + */ Val* Compiler::compile_asm_file(const goos::Object& form, const goos::Object& rest, Env* env) { (void)env; int i = 0; @@ -39,6 +57,7 @@ Val* Compiler::compile_asm_file(const goos::Object& form, const goos::Object& re std::vector> timing; Timer total_timer; + // parse arguments for_each_in_list(rest, [&](const goos::Object& o) { if (i == 0) { filename = as_string(o); @@ -59,43 +78,49 @@ Val* Compiler::compile_asm_file(const goos::Object& form, const goos::Object& re i++; }); + // READ Timer reader_timer; auto code = m_goos.reader.read_from_file({filename}); timing.emplace_back("read", reader_timer.getMs()); Timer compile_timer; std::string obj_file_name = filename; + + // Extract object name from file name. for (int idx = int(filename.size()) - 1; idx-- > 0;) { if (filename.at(idx) == '\\' || filename.at(idx) == '/') { obj_file_name = filename.substr(idx + 1); break; } } - obj_file_name = obj_file_name.substr(0, obj_file_name.find_last_of('.')); + + // COMPILE auto obj_file = compile_object_file(obj_file_name, code, !no_code); timing.emplace_back("compile", compile_timer.getMs()); if (color) { + // register allocation Timer color_timer; color_object_file(obj_file); timing.emplace_back("color", color_timer.getMs()); + // code/object file generation Timer codegen_timer; auto data = codegen_object_file(obj_file); timing.emplace_back("codegen", codegen_timer.getMs()); + // send to target if (load) { if (m_listener.is_connected()) { m_listener.send_code(data); } else { - printf("WARNING - couldn't load because listener isn't connected\n"); + printf("WARNING - couldn't load because listener isn't connected\n"); // todo spdlog warn } } + // save file if (write) { - // auto output_dir = as_string(get_constant_or_error(form, "*compiler-output-path*")); - // todo, change extension based on v3/v4 auto output_name = m_goos.reader.get_source_dir() + "/data/" + obj_file_name + ".o"; file_util::write_binary_file(output_name, (void*)data.data(), data.size()); } @@ -109,23 +134,29 @@ Val* Compiler::compile_asm_file(const goos::Object& form, const goos::Object& re } } - // if(truthy(get_config("print-asm-file-time"))) { - printf("F: %36s ", obj_file_name.c_str()); - for (auto& e : timing) { - printf(" %12s %4.2f", e.first.c_str(), e.second); + if (m_settings.print_timing) { + printf("F: %36s ", obj_file_name.c_str()); + timing.emplace_back("total", total_timer.getMs()); + for (auto& e : timing) { + printf(" %12s %4.2f", e.first.c_str(), e.second / 1000.f); + } + printf("\n"); } - printf("\n"); - // } return get_none(); } +/*! + * Connect the compiler to a target. Takes an optional IP address / port, defaults to + * 127.0.0.1 and 8112, which is the local computer and the default port for the DECI2 over IP + * implementation. + */ Val* Compiler::compile_listen_to_target(const goos::Object& form, const goos::Object& rest, Env* env) { (void)env; std::string ip = "127.0.0.1"; - int port = 8112; // todo, get from some constant somewhere + int port = DECI2_PORT; bool got_port = false, got_ip = false; for_each_in_list(rest, [&](const goos::Object& o) { @@ -150,6 +181,11 @@ Val* Compiler::compile_listen_to_target(const goos::Object& form, return get_none(); } +/*! + * Send the target a command to reset, which totally resets the state of the target. + * Optionally takes a :shutdown command which causes the exec_runtime function of the target + * to return after MachineShutdown. + */ Val* Compiler::compile_reset_target(const goos::Object& form, const goos::Object& rest, Env* env) { (void)env; bool shutdown = false; @@ -164,6 +200,11 @@ Val* Compiler::compile_reset_target(const goos::Object& form, const goos::Object return get_none(); } +/*! + * Send a "poke" message to the target. This can be used to check if the target is still alive and + * acknowledges commands, and also tells that target that somebody is connected so it will flush + * its outgoing buffers that have been storing data from startup. + */ Val* Compiler::compile_poke(const goos::Object& form, const goos::Object& rest, Env* env) { (void)env; auto args = get_va(form, rest); @@ -172,6 +213,9 @@ Val* Compiler::compile_poke(const goos::Object& form, const goos::Object& rest, return get_none(); } +/*! + * Enter a goos REPL. + */ Val* Compiler::compile_gs(const goos::Object& form, const goos::Object& rest, Env* env) { (void)env; auto args = get_va(form, rest); @@ -180,6 +224,9 @@ Val* Compiler::compile_gs(const goos::Object& form, const goos::Object& rest, En return get_none(); } +/*! + * Set a compiler setting by name. + */ Val* Compiler::compile_set_config(const goos::Object& form, const goos::Object& rest, Env* env) { (void)env; auto args = get_va(form, rest); @@ -188,6 +235,9 @@ Val* Compiler::compile_set_config(const goos::Object& form, const goos::Object& return get_none(); } +/*! + * Ignore the "in-package" statement and anything it contains at the top of GOAL files. + */ Val* Compiler::compile_in_package(const goos::Object& form, const goos::Object& rest, Env* env) { (void)form; (void)rest; @@ -195,6 +245,10 @@ Val* Compiler::compile_in_package(const goos::Object& form, const goos::Object& return get_none(); } +/*! + * Build dgo files. Takes a string argument pointing to the DGO description file, which is read + * and parsed here. + */ Val* Compiler::compile_build_dgo(const goos::Object& form, const goos::Object& rest, Env* env) { (void)env; auto args = get_va(form, rest); diff --git a/goalc/compiler/compilation/ControlFlow.cpp b/goalc/compiler/compilation/ControlFlow.cpp index cdbdf94359..d65ed7291b 100644 --- a/goalc/compiler/compilation/ControlFlow.cpp +++ b/goalc/compiler/compilation/ControlFlow.cpp @@ -1,10 +1,18 @@ +/*! + * @file ControlFlow.cpp + * Compiler forms related to conditional branching and control flow. + */ + #include "goalc/compiler/Compiler.h" /*! - * Convert a condition expression into a GoalCondition for use in a conditional branch. + * Convert an expression into a GoalCondition for use in a conditional branch. + * * The reason for this design is to allow an optimization for * (if (< a b) ...) to be compiled without actually computing a true/false value for the (< a b) * expression. Instead, it will generate a cmp + jle sequence of instructions, which is much faster. + * In particular, getting GOAL "true" requires a few instructions, so it's to avoid this when + * possible. * * This can be applied to _any_ GOAL form, and will return a GoalCondition which can be used with a * Branch IR to branch if the condition is true/false. When possible it applies the optimization @@ -95,7 +103,7 @@ Condition Compiler::compile_condition(const goos::Object& condition, Env* env, b } } - // not something we can process more. Just check if we get false. + // not something we can process more. Just evaluate as normal and check if we get false. // todo - it's possible to optimize a false comparison because the false offset is zero gc.kind = invert ? ConditionKind::EQUAL : ConditionKind::NOT_EQUAL; gc.a = compile_error_guard(condition, env)->to_gpr(env); @@ -104,6 +112,12 @@ Condition Compiler::compile_condition(const goos::Object& condition, Env* env, b return gc; } +/*! + * Compile a comparison when we explicitly want a boolean result. This is used whenever a condition + * _isn't_ used as a branch condition. Like (set! x (< 1 2)) + * + * TODO, this could be optimized quite a bit. + */ Val* Compiler::compile_condition_as_bool(const goos::Object& form, const goos::Object& rest, Env* env) { @@ -124,6 +138,10 @@ Val* Compiler::compile_condition_as_bool(const goos::Object& form, return result; } +/*! + * The when-goto form is a better version of (if condition (goto x)) + * It compiles into a single conditional branch. + */ Val* Compiler::compile_when_goto(const goos::Object& form, const goos::Object& _rest, Env* env) { (void)form; auto* rest = &_rest; @@ -141,6 +159,12 @@ Val* Compiler::compile_when_goto(const goos::Object& form, const goos::Object& _ return get_none(); } +/*! + * The Scheme/Lisp "cond" form. + * Works like you expect. Return type is the lowest common ancestor of all possible return values. + * If no cases match and there's no else, returns #f. + * TODO - how should the return type work if #f can possibly be returned? + */ Val* Compiler::compile_cond(const goos::Object& form, const goos::Object& rest, Env* env) { auto result = env->make_gpr(m_ts.make_typespec("object")); @@ -170,12 +194,16 @@ Val* Compiler::compile_cond(const goos::Object& form, const goos::Object& rest, Val* case_result = get_none(); for_each_in_list(clauses, [&](const goos::Object& clause) { case_result = compile_error_guard(clause, env); + if (!dynamic_cast(case_result)) { + case_result = case_result->to_reg(env); + } }); case_result_types.push_back(case_result->type()); // optimization - if we get junk, don't bother moving it, just leave junk in return. if (!is_none(case_result)) { + // todo, what does GOAL do here? does it matter? env->emit(std::make_unique(result, case_result->to_gpr(env))); } @@ -193,10 +221,14 @@ Val* Compiler::compile_cond(const goos::Object& form, const goos::Object& rest, Val* case_result = get_none(); for_each_in_list(clauses, [&](const goos::Object& clause) { case_result = compile_error_guard(clause, env); + if (!dynamic_cast(case_result)) { + case_result = case_result->to_reg(env); + } }); case_result_types.push_back(case_result->type()); if (!is_none(case_result)) { + // todo, what does GOAL do here? env->emit(std::make_unique(result, case_result->to_gpr(env))); } @@ -210,13 +242,12 @@ Val* Compiler::compile_cond(const goos::Object& form, const goos::Object& rest, }); if (!got_else) { - // if no else, clause, return #f. But don't retype. I don't know how I feel about this typing - // setup. + // if no else, clause, return #f. But don't retype. todo what does goal do here? auto get_false = std::make_unique(result, "#f"); env->emit(std::move(get_false)); } - result->set_type(m_ts.lowest_common_ancestor(case_result_types)); + result->set_type(coerce_to_reg_type(m_ts.lowest_common_ancestor(case_result_types))); // PATCH END end_label->idx = fenv->code().size(); diff --git a/goalc/compiler/compilation/Define.cpp b/goalc/compiler/compilation/Define.cpp index 4c24f2230d..72b4888b30 100644 --- a/goalc/compiler/compilation/Define.cpp +++ b/goalc/compiler/compilation/Define.cpp @@ -1,6 +1,15 @@ +/*! + * @file Define.cpp + * Forms which define or set things. + */ + #include "goalc/compiler/Compiler.h" #include "goalc/logger/Logger.h" +/*! + * Define or set a global value. Has some special magic to store data for functions which may be + * inlined. + */ Val* Compiler::compile_define(const goos::Object& form, const goos::Object& rest, Env* env) { auto args = get_va(form, rest); va_check(form, args, {goos::ObjectType::SYMBOL, {}}, {}); @@ -37,10 +46,17 @@ Val* Compiler::compile_define(const goos::Object& form, const goos::Object& rest typecheck(form, existing_type->second, in_gpr->type(), "define on existing symbol"); } + if (!sym_val->settable()) { + throw_compile_error( + form, "Tried to use define on something that wasn't settable: " + sym_val->print()); + } fe->emit(std::make_unique(sym_val, in_gpr)); return in_gpr; } +/*! + * Inform the compiler of the type of a global. Will warn on changing type. + */ Val* Compiler::compile_define_extern(const goos::Object& form, const goos::Object& rest, Env* env) { (void)env; auto args = get_va(form, rest); @@ -52,6 +68,7 @@ Val* Compiler::compile_define_extern(const goos::Object& form, const goos::Objec auto existing_type = m_symbol_types.find(symbol_string(sym)); if (existing_type != m_symbol_types.end() && existing_type->second != new_type) { + // todo spdlog gLogger.log( MSG_WARN, "[Warning] define-extern has redefined the type of symbol %s\npreviously: %s\nnow: %s\n", @@ -62,11 +79,18 @@ Val* Compiler::compile_define_extern(const goos::Object& form, const goos::Objec return get_none(); } +/*! + * Set something to something. + * Lots of special cases. + */ Val* Compiler::compile_set(const goos::Object& form, const goos::Object& rest, Env* env) { auto args = get_va(form, rest); va_check(form, args, {{}, {}}, {}); auto& destination = args.unnamed.at(0); + // todo, I don't know if this is the correct order or not. Right now the value is computed + // and to_reg'd first, then the destination is computed, if the destination requires math to + // compute. auto source = compile_error_guard(args.unnamed.at(1), env)->to_reg(env); if (destination.is_symbol()) { @@ -91,12 +115,48 @@ Val* Compiler::compile_set(const goos::Object& form, const goos::Object& rest, E auto sym_val = fe->alloc_val(symbol_string(destination), m_ts.make_typespec("symbol")); auto result_in_gpr = source->to_gpr(env); + if (!sym_val->settable()) { + throw_compile_error( + form, "Tried to use set! on something that wasn't settable: " + sym_val->print()); + } env->emit(std::make_unique(sym_val, result_in_gpr)); return result_in_gpr; } } } else { - throw_compile_error(form, "Set not implemented for this yet"); + // destination is some complex expression, so compile it and hopefully get something settable. + auto dest = compile_error_guard(destination, env); + if (!dest->settable()) { + throw_compile_error(form, + "Tried to use set! on something that wasn't settable: " + dest->print()); + } + auto as_mem_deref = dynamic_cast(dest); + auto as_pair = dynamic_cast(dest); + if (as_mem_deref) { + // setting somewhere in memory + auto base = as_mem_deref->base; + auto base_as_mco = dynamic_cast(base); + if (base_as_mco) { + // if it is a constant offset, we can use a fancy x86-64 addressing mode to simplify + auto ti = m_ts.lookup_type(as_mem_deref->type()); + env->emit(std::make_unique( + source, base_as_mco->offset, base_as_mco->base->to_gpr(env), ti->get_load_size())); + return source; + } else { + // nope, the pointer to dereference is some compliated thing. + auto ti = m_ts.lookup_type(as_mem_deref->type()); + env->emit(std::make_unique(source, 0, base->to_gpr(env), + ti->get_load_size())); + return source; + } + } else if (as_pair) { + // this could probably be part of MemoryDerefVal and not a special case here. + env->emit(std::make_unique(source, as_pair->is_car ? -2 : 2, + as_pair->base->to_gpr(env), 4)); + return source; + } else { + throw_compile_error(form, "Set not implemented for this yet"); + } } throw std::runtime_error("Unexpected error in Set"); } \ No newline at end of file diff --git a/goalc/compiler/compilation/Function.cpp b/goalc/compiler/compilation/Function.cpp index 459874e7db..480ad161c1 100644 --- a/goalc/compiler/compilation/Function.cpp +++ b/goalc/compiler/compilation/Function.cpp @@ -1,7 +1,15 @@ +/*! + * @file Function.cpp + * Calling and defining functions, lambdas, and inlining. + */ + #include "goalc/compiler/Compiler.h" #include "goalc/logger/Logger.h" namespace { +/*! + * Get the preference to inline of the given environment. + */ bool get_inline_preference(Env* env) { auto ile = get_parent_env_of_type(env); if (ile) { @@ -11,6 +19,9 @@ bool get_inline_preference(Env* env) { } } +/*! + * Hacky function to seek past arguments to get a goos::Object containing the body of a lambda. + */ const goos::Object& get_lambda_body(const goos::Object& def) { auto* iter = &def; while (true) { @@ -26,6 +37,14 @@ const goos::Object& get_lambda_body(const goos::Object& def) { } } // namespace +/*! + * The (inline my-func) form is like my-func, except my-func will be inlined instead of called, + * when used in a function call. This only works for immediaate function calls, you can't "save" + * an (inline my-func) into a function pointer. + * + * If inlining is not possible (function disallows inlining or didn't save its code), throw an + * error. + */ Val* Compiler::compile_inline(const goos::Object& form, const goos::Object& rest, Env* env) { (void)env; auto args = get_va(form, rest); @@ -39,17 +58,19 @@ Val* Compiler::compile_inline(const goos::Object& form, const goos::Object& rest if (kv->second->func && !kv->second->func->settings.allow_inline) { throw_compile_error(form, "Found function to inline, but it isn't allowed."); } - - // todo, this should return a "view" of the lambda which indicates its inlined - // so the correct label namespace behavior can be used. - return kv->second; + auto fe = get_parent_env_of_type(env); + return fe->alloc_val(kv->second->type(), kv->second); } +/*! + * Compile a lambda. This is used for real lambdas, lets, and defuns. So there are a million + * confusing special cases... + */ Val* Compiler::compile_lambda(const goos::Object& form, const goos::Object& rest, Env* env) { auto fe = get_parent_env_of_type(env); auto args = get_va(form, rest); if (args.unnamed.empty() || !args.unnamed.front().is_list() || - !args.only_contains_named({"name", "inline-only"})) { + !args.only_contains_named({"name", "inline-only", "segment"})) { throw_compile_error(form, "Invalid lambda form"); } @@ -65,7 +86,7 @@ Val* Compiler::compile_lambda(const goos::Object& form, const goos::Object& rest lambda_ts.add_arg(m_ts.make_typespec("object")); } else { auto param_args = get_va(o, o); - va_check(o, param_args, {goos::ObjectType::SYMBOL, goos::ObjectType::SYMBOL}, {}); + va_check(o, param_args, {goos::ObjectType::SYMBOL, {}}, {}); GoalArg parm; parm.name = symbol_string(param_args.unnamed.at(0)); @@ -77,9 +98,8 @@ Val* Compiler::compile_lambda(const goos::Object& form, const goos::Object& rest }); assert(lambda.params.size() == lambda_ts.arg_count()); - // optional name for debugging + // optional name for debugging (defun sets this) if (args.has_named("name")) { - // todo, this probably prints a nasty error if name isn't a string. lambda.debug_name = symbol_string(args.get_named("name")); } @@ -89,13 +109,37 @@ Val* Compiler::compile_lambda(const goos::Object& form, const goos::Object& rest bool inline_only = args.has_named("inline-only") && symbol_string(args.get_named("inline-only")) != "#f"; + // pick default segment to store function in. + int segment = MAIN_SEGMENT; + if (fe->segment == DEBUG_SEGMENT) { + // make anonymous lambdas in debug functions also go to debug + segment = DEBUG_SEGMENT; + } + + // override default segment. + if (args.has_named("segment")) { + auto segment_name = symbol_string(args.get_named("segment")); + if (segment_name == "main") { + segment = MAIN_SEGMENT; + } else if (segment_name == "debug") { + segment = DEBUG_SEGMENT; + } else { + throw_compile_error(form, "invalid segment override in lambda"); + } + } + if (!inline_only) { // compile a function! First create env auto new_func_env = std::make_unique(env, lambda.debug_name); - new_func_env->set_segment(MAIN_SEGMENT); // todo, how do we set debug? + new_func_env->set_segment(segment); // set up arguments - assert(lambda.params.size() < 8); // todo graceful error + if (lambda.params.size() >= 8) { + throw_compile_error(form, "lambda generating code has too many parameters!"); + } + + // set up argument register constraints. + std::vector args_for_coloring; for (u32 i = 0; i < lambda.params.size(); i++) { IRegConstraint constr; constr.instr_idx = 0; // constraint at function start @@ -104,6 +148,7 @@ Val* Compiler::compile_lambda(const goos::Object& form, const goos::Object& rest constr.desired_register = emitter::gRegInfo.get_arg_reg(i); new_func_env->params[lambda.params.at(i).name] = ireg; new_func_env->constrain(constr); + args_for_coloring.push_back(ireg); } place->func = new_func_env.get(); @@ -113,29 +158,39 @@ Val* Compiler::compile_lambda(const goos::Object& form, const goos::Object& rest auto func_block_env = new_func_env->alloc_env(new_func_env.get(), "#f"); func_block_env->return_value = return_reg; func_block_env->end_label = Label(new_func_env.get()); + func_block_env->emit(std::make_unique(args_for_coloring)); - // compile the function! + // compile the function, iterating through the body. Val* result = nullptr; bool first_thing = true; for_each_in_list(lambda.body, [&](const goos::Object& o) { result = compile_error_guard(o, func_block_env); + if (!dynamic_cast(result)) { + result = result->to_reg(func_block_env); + } if (first_thing) { first_thing = false; - // you could probably cheat and do a (begin (blorp) (declare ...)) to get around this. + // you could cheat and do a (begin (blorp) (declare ...)) to get around this. + // but I see no strong reason why "declare"s need to go at the beginning, so no reason + // to make this better. new_func_env->settings.is_set = true; } }); if (result) { + // got a result, so to_gpr it and return it. auto final_result = result->to_gpr(new_func_env.get()); new_func_env->emit(std::make_unique(return_reg, final_result)); - // new_func_env->emit(std::make_unique())??? - new_func_env->finish(); lambda_ts.add_arg(final_result->type()); } else { + // empty body, return none lambda_ts.add_arg(m_ts.make_typespec("none")); } + // put null instruction at the end so jumps to the end have somewhere to go. func_block_env->end_label.idx = new_func_env->code().size(); + new_func_env->emit(std::make_unique()); + new_func_env->finish(); + // save our code for possible inlining auto obj_env = get_parent_env_of_type(new_func_env.get()); assert(obj_env); if (new_func_env->settings.save_code) { @@ -147,12 +202,16 @@ Val* Compiler::compile_lambda(const goos::Object& form, const goos::Object& rest return place; } +/*! + * Compile a form which should be either a function call (possibly inline) or method call. + * Note - calling method "new" isn't handled by this. + * Again, there are way too many special cases here. + */ Val* Compiler::compile_function_or_method_call(const goos::Object& form, Env* env) { goos::Object f = form; auto fe = get_parent_env_of_type(env); auto args = get_va(form, form); - auto uneval_head = args.unnamed.at(0); Val* head = get_none(); @@ -160,7 +219,7 @@ Val* Compiler::compile_function_or_method_call(const goos::Object& form, Env* en // this logic will not trigger for a manually inlined call [using the (inline func) form] bool auto_inline = false; if (uneval_head.is_symbol()) { - // we can only auto-inline the function if its name is explicit. + // we can only auto-inline the function if its name is explicitly given. // look it up: auto kv = m_inlineable_functions.find(uneval_head.as_symbol()); if (kv != m_inlineable_functions.end()) { @@ -211,10 +270,24 @@ Val* Compiler::compile_function_or_method_call(const goos::Object& form, Env* en // LambdaPlace! so this cast will only succeed if the auto-inliner succeeded, or the user has // passed use explicitly a lambda either with the lambda form, or with the (inline ...) form. LambdaVal* head_as_lambda = nullptr; + bool got_inlined_lambda = false; if (!is_method_call) { + // try directly as a lambda head_as_lambda = dynamic_cast(head); + + if (!head_as_lambda) { + // nope, so try as an (inline x) + auto head_as_inlined_lambda = dynamic_cast(head); + if (head_as_inlined_lambda) { + // yes, remember the lambda that contains and flag that we're inlining. + head_as_lambda = head_as_inlined_lambda->lv; + got_inlined_lambda = true; + } + } } + // no lambda (not inlining or immediate), and not a method call, so we should actually get + // the function pointer. if (!head_as_lambda && !is_method_call) { head = head->to_gpr(env); } @@ -223,11 +296,12 @@ Val* Compiler::compile_function_or_method_call(const goos::Object& form, Env* en std::vector eval_args; for (uint32_t i = 1; i < args.unnamed.size(); i++) { auto intermediate = compile_error_guard(args.unnamed.at(i), env); + // todo, are the eval/to_reg'd in batches? eval_args.push_back(intermediate->to_reg(env)); } if (head_as_lambda) { - // inline the function! + // inline/immediate the function! // check args are ok if (head_as_lambda->lambda.params.size() != eval_args.size()) { @@ -239,26 +313,32 @@ Val* Compiler::compile_function_or_method_call(const goos::Object& form, Env* en Env* compile_env = lexical_env; - // if needed create a label env. - // we don't want a separate label env with lets, but we do in other cases. - if (auto_inline) { - // TODO - this misses the case of (inline func)! + // if need to, create a label env. + // we don't want a separate label env with lets, but we do for inlined functions. + // either inlined through the auto-inliner, or through an explicit (inline x) form. + if (auto_inline || got_inlined_lambda) { compile_env = fe->alloc_env(lexical_env); } // check arg types if (!head->type().arg_count()) { if (head->type().arg_count() - 1 != eval_args.size()) { - throw_compile_error(form, "invalid number of arguments to function call (inline)"); + throw_compile_error(form, + "invalid number of arguments to function call (inline or immediate " + "lambda application)"); } + // immediate lambdas (lets) will have all types as the most general object by default + // inlined functions will have real types that are checked... for (uint32_t i = 0; i < eval_args.size(); i++) { typecheck(form, head->type().get_arg(i), eval_args.at(i)->type(), - "function (inline) argument"); + "function/lambda (inline/immediate) argument"); } } // copy args... for (uint32_t i = 0; i < eval_args.size(); i++) { + // note, inlined functions will get a more specific type if possible + // todo, is this right? auto type = eval_args.at(i)->type(); auto copy = env->make_ireg(type, get_preferred_reg_kind(type)); env->emit(std::make_unique(copy, eval_args.at(i))); @@ -270,32 +350,43 @@ Val* Compiler::compile_function_or_method_call(const goos::Object& form, Env* en Val* result = get_none(); for_each_in_list(head_as_lambda->lambda.body, [&](const goos::Object& o) { result = compile_error_guard(o, compile_env); + if (!dynamic_cast(result)) { + result = result->to_reg(compile_env); + } if (first_thing) { first_thing = false; lexical_env->settings.is_set = true; } }); - // this doesn't require a return type. + // ignore the user specified return type and return the most specific type. + // todo - does this make sense for an inline function? Should we check the return type? return result; } else { - // not an inline call + // not an inlined/immediate, it's a real function call. + // todo, this order is extremely likely to be wrong, we should get the method way earlier. if (is_method_call) { - throw_compile_error(form, "Unrecognized symbol " + uneval_head.print() + " as head of form"); - // // determine the method to call by looking at the type of first argument - // if (eval_args.empty()) { - // - // } - // printf("BAD %s\n", uneval_head.print().c_str()); - // assert(false); // nyi - // head = compile_get_method_of_object(eval_args.front(), symbol_string(uneval_head), env); + // method needs at least one argument to tell what we're calling the method on. + if (eval_args.empty()) { + throw_compile_error(form, + "Unrecognized symbol " + uneval_head.print() + " as head of form"); + } + // get the method function pointer + head = compile_get_method_of_object(eval_args.front(), symbol_string(uneval_head), env); + fmt::format("method of object {} {}\n", head->print(), head->type().print()); } - // convert the head to a GPR - auto head_as_gpr = - head->to_gpr(env); // std::dynamic_pointer_cast(resolve_to_gpr(head, env)); + // convert the head to a GPR (if function, this is already done) + auto head_as_gpr = head->to_gpr(env); if (head_as_gpr) { - return compile_real_function_call(form, head_as_gpr, eval_args, env); + // method calls have special rules for typing _type_ arguments. + if (is_method_call) { + return compile_real_function_call(form, head_as_gpr, eval_args, env, + eval_args.front()->type().base_type()); + } else { + return compile_real_function_call(form, head_as_gpr, eval_args, env); + } + } else { throw_compile_error(form, "can't figure out this function call!"); } @@ -305,47 +396,51 @@ Val* Compiler::compile_function_or_method_call(const goos::Object& form, Env* en return get_none(); } +namespace { +/*! + * Is the given typespec for a varargs function? Assumes typespec is a function to begin with. + */ +bool is_varargs_function(const TypeSpec& ts) { + return ts.arg_count() >= 2 && ts.get_arg(0).print() == "_varargs_"; +} +} // namespace + +/*! + * Do a real x86-64 function call. + */ Val* Compiler::compile_real_function_call(const goos::Object& form, RegVal* function, const std::vector& args, - Env* env) { + Env* env, + const std::string& method_type_name) { auto fe = get_parent_env_of_type(env); fe->require_aligned_stack(); TypeSpec return_ts; if (function->type().arg_count() == 0) { - // if the type system doesn't know what the function will return, just make it object. - // the user is responsible for getting this right. - return_ts = m_ts.make_typespec("object"); - gLogger.log(MSG_WARN, "[Warning] Function call could not determine return type: %s\n", - form.print().c_str()); - // todo, should this be a warning? not a great thing if we don't know what a function will - // return? + // if the type system doesn't know what the function will return, don't allow it to be called + throw_compile_error( + form, "This function call has unknown argument and return types and cannot be called"); } else { return_ts = function->type().last_arg(); } auto return_reg = env->make_ireg(return_ts, emitter::RegKind::GPR); - // TODO - VERY IMPORTANT - // CREATE A TEMP COPY OF FUNCTION! WILL BE DESTROYED. - - // nope! not anymore. - // for(auto& arg : args) { - // // note: this has to be done in here, because we might want to const prop across lexical - // envs. arg = resolve_to_gpr(arg, env); - // } - // check arg count: - if (function->type().arg_count()) { + if (function->type().arg_count() && !is_varargs_function(function->type())) { if (function->type().arg_count() - 1 != args.size()) { - printf("got type %s\n", function->type().print().c_str()); throw_compile_error(form, "invalid number of arguments to function call: got " + std::to_string(args.size()) + " and expected " + std::to_string(function->type().arg_count() - 1) + " for " + function->type().print()); } for (uint32_t i = 0; i < args.size(); i++) { - typecheck(form, function->type().get_arg(i), args.at(i)->type(), "function argument"); + if (method_type_name.empty()) { + typecheck(form, function->type().get_arg(i), args.at(i)->type(), "function argument"); + } else { + typecheck(form, function->type().get_arg(i).substitute_for_method_call(method_type_name), + args.at(i)->type(), "function argument"); + } } } @@ -356,7 +451,10 @@ Val* Compiler::compile_real_function_call(const goos::Object& form, env->emit(std::make_unique(arg_outs.back(), arg)); } - env->emit(std::make_unique(function, return_reg, arg_outs)); + // todo, there's probably a more efficient way to do this. + auto temp_function = fe->make_gpr(function->type()); + env->emit(std::make_unique(temp_function, function)); + env->emit(std::make_unique(temp_function, return_reg, arg_outs)); if (m_settings.emit_move_after_return) { auto result_reg = env->make_gpr(return_reg->type()); @@ -367,6 +465,10 @@ Val* Compiler::compile_real_function_call(const goos::Object& form, } } +/*! + * A (declare ...) form can be used to configure settings inside a function. + * Currently there aren't many useful settings, but more may be added in the future. + */ Val* Compiler::compile_declare(const goos::Object& form, const goos::Object& rest, Env* env) { auto& settings = get_parent_env_of_type(env)->settings; diff --git a/goalc/compiler/compilation/Macro.cpp b/goalc/compiler/compilation/Macro.cpp index 8116ed1cbc..9cbc91b24e 100644 --- a/goalc/compiler/compilation/Macro.cpp +++ b/goalc/compiler/compilation/Macro.cpp @@ -2,6 +2,9 @@ using namespace goos; +/*! + * Try to find a macro with the given name in the GOOS "goal_env". Return if it succeeded. + */ bool Compiler::try_getting_macro_from_goos(const goos::Object& macro_name, goos::Object* dest) { Object macro_obj; bool got_macro = false; @@ -20,6 +23,9 @@ bool Compiler::try_getting_macro_from_goos(const goos::Object& macro_name, goos: return got_macro; } +/*! + * Expand a macro, then compile the result. + */ Val* Compiler::compile_goos_macro(const goos::Object& o, const goos::Object& macro_obj, const goos::Object& rest, @@ -37,6 +43,9 @@ Val* Compiler::compile_goos_macro(const goos::Object& o, return compile_error_guard(goos_result, env); } +/*! + * Compile the #cond form, which is a compile-time conditional statement. + */ Val* Compiler::compile_gscond(const goos::Object& form, const goos::Object& rest, Env* env) { if (!rest.is_pair()) { throw_compile_error(form, "#cond must have at least one clause, which must be a form"); @@ -61,8 +70,12 @@ Val* Compiler::compile_gscond(const goos::Object& form, const goos::Object& rest // got a match! result = get_none(); - for_each_in_list(current_case.as_pair()->cdr, - [&](const Object& o) { result = compile_error_guard(o, env); }); + for_each_in_list(current_case.as_pair()->cdr, [&](const Object& o) { + result = compile_error_guard(o, env); + if (!dynamic_cast(result)) { + result = result->to_reg(env); + } + }); return result; } else { // no match, continue. @@ -76,6 +89,10 @@ Val* Compiler::compile_gscond(const goos::Object& form, const goos::Object& rest } } +/*! + * Compile (quote x) or 'x forms. + * Current only supports 'thing or '(). Static lists/pairs should be added at some point. + */ Val* Compiler::compile_quote(const goos::Object& form, const goos::Object& rest, Env* env) { auto args = get_va(form, rest); va_check(form, args, {{}}, {}); @@ -83,6 +100,11 @@ Val* Compiler::compile_quote(const goos::Object& form, const goos::Object& rest, switch (thing.type) { case goos::ObjectType::SYMBOL: return compile_get_sym_obj(thing.as_symbol()->name, env); + case goos::ObjectType::EMPTY_LIST: { + auto empty_pair = compile_get_sym_obj("_empty_", env); + empty_pair->set_type(m_ts.make_typespec("pair")); + return empty_pair; + } // todo... default: throw_compile_error(form, "Can't quote this"); @@ -90,6 +112,9 @@ Val* Compiler::compile_quote(const goos::Object& form, const goos::Object& rest, return get_none(); } +/*! + * Compile defglobalconstant forms, which define a constant in both GOOS and GOAL. + */ Val* Compiler::compile_defglobalconstant(const goos::Object& form, const goos::Object& _rest, Env* env) { @@ -117,6 +142,9 @@ Val* Compiler::compile_defglobalconstant(const goos::Object& form, return get_none(); } +/*! + * Compile an "mlet" scoped constant/symbol macro form + */ Val* Compiler::compile_mlet(const goos::Object& form, const goos::Object& rest, Env* env) { auto defs = pair_car(rest); auto body = pair_cdr(rest); @@ -131,6 +159,11 @@ Val* Compiler::compile_mlet(const goos::Object& form, const goos::Object& rest, }); Val* result = get_none(); - for_each_in_list(body, [&](const goos::Object& o) { result = compile_error_guard(o, menv); }); + for_each_in_list(body, [&](const goos::Object& o) { + result = compile_error_guard(o, menv); + if (!dynamic_cast(result)) { + result = result->to_reg(menv); + } + }); return result; } \ No newline at end of file diff --git a/goalc/compiler/compilation/Math.cpp b/goalc/compiler/compilation/Math.cpp index 4a5db0dbd9..674152f17a 100644 --- a/goalc/compiler/compilation/Math.cpp +++ b/goalc/compiler/compilation/Math.cpp @@ -44,7 +44,10 @@ Val* Compiler::number_to_integer(Val* in, Env* env) { if (is_binteger(ts)) { throw std::runtime_error("Can't convert " + in->print() + " (a binteger) to an integer."); } else if (is_float(ts)) { - throw std::runtime_error("Can't convert " + in->print() + " (a float) to an integer."); + auto fe = get_parent_env_of_type(env); + auto result = fe->make_gpr(m_ts.make_typespec("int")); + env->emit(std::make_unique(result, in->to_xmm(env))); + return result; } else if (is_integer(ts)) { return in; } @@ -59,7 +62,11 @@ Val* Compiler::number_to_binteger(Val* in, Env* env) { } else if (is_float(ts)) { throw std::runtime_error("Can't convert " + in->print() + " (a float) to a binteger."); } else if (is_integer(ts)) { - throw std::runtime_error("Can't convert " + in->print() + " (an integer) to a binteger."); + auto fe = get_parent_env_of_type(env); + RegVal* input = in->to_reg(env); + auto sa = fe->make_gpr(m_ts.make_typespec("int")); + env->emit(std::make_unique(sa, 3)); + return compile_variable_shift(input, sa, env, IntegerMathKind::SHLV_64); } throw std::runtime_error("Can't convert " + in->print() + " to a binteger."); } @@ -72,7 +79,10 @@ Val* Compiler::number_to_float(Val* in, Env* env) { } else if (is_float(ts)) { return in; } else if (is_integer(ts)) { - throw std::runtime_error("Can't convert " + in->print() + " (an integer) to a float."); + auto fe = get_parent_env_of_type(env); + auto result = fe->make_xmm(m_ts.make_typespec("float")); + env->emit(std::make_unique(result, in->to_gpr(env))); + return result; } else { throw std::runtime_error("Can't convert " + in->print() + " a float."); } @@ -114,6 +124,19 @@ Val* Compiler::compile_add(const goos::Object& form, const goos::Object& rest, E } return result; } + + case MATH_FLOAT: { + auto result = env->make_xmm(first_type); + env->emit(std::make_unique(result, first_val->to_xmm(env))); + + for (size_t i = 1; i < args.unnamed.size(); i++) { + env->emit(std::make_unique( + FloatMathKind::ADD_SS, result, + to_math_type(compile_error_guard(args.unnamed.at(i), env), math_type, env) + ->to_xmm(env))); + } + return result; + } case MATH_INVALID: throw_compile_error( form, "Cannot determine the math mode for object of type " + first_type.print()); @@ -204,6 +227,30 @@ Val* Compiler::compile_sub(const goos::Object& form, const goos::Object& rest, E return result; } + case MATH_FLOAT: + if (args.unnamed.size() == 1) { + auto result = + compile_float(0, env, get_parent_env_of_type(env)->segment)->to_xmm(env); + env->emit(std::make_unique( + FloatMathKind::SUB_SS, result, + to_math_type(compile_error_guard(args.unnamed.at(0), env), math_type, env) + ->to_xmm(env))); + return result; + } else { + auto result = env->make_xmm(first_type); + env->emit(std::make_unique( + result, to_math_type(compile_error_guard(args.unnamed.at(0), env), math_type, env) + ->to_xmm(env))); + + for (size_t i = 1; i < args.unnamed.size(); i++) { + env->emit(std::make_unique( + FloatMathKind::SUB_SS, result, + to_math_type(compile_error_guard(args.unnamed.at(i), env), math_type, env) + ->to_xmm(env))); + } + return result; + } + case MATH_INVALID: throw_compile_error( form, "Cannot determine the math mode for object of type " + first_type.print()); diff --git a/goalc/compiler/compilation/Type.cpp b/goalc/compiler/compilation/Type.cpp index e611aaa2e6..5426811667 100644 --- a/goalc/compiler/compilation/Type.cpp +++ b/goalc/compiler/compilation/Type.cpp @@ -1,11 +1,20 @@ #include "goalc/compiler/Compiler.h" #include "common/type_system/deftype.h" +namespace { +int get_offset_of_method(int id) { + // todo - something that looks at the type system? + // this will need changing if the layout of type ever changes. + return 16 + 4 * id; +} +} // namespace + RegVal* Compiler::compile_get_method_of_type(const TypeSpec& type, const std::string& method_name, Env* env) { auto info = m_ts.lookup_method(type.base_type(), method_name); - auto offset_of_method = 16 + 4 * info.id; // todo, something more flexible? + info.type = info.type.substitute_for_method_call(type.base_type()); + auto offset_of_method = get_offset_of_method(info.id); auto fe = get_parent_env_of_type(env); auto typ = compile_get_symbol_value(type.base_type(), env)->to_gpr(env); @@ -25,6 +34,44 @@ RegVal* Compiler::compile_get_method_of_type(const TypeSpec& type, return deref->to_reg(env); } +RegVal* Compiler::compile_get_method_of_object(RegVal* object, + const std::string& method_name, + Env* env) { + auto& compile_time_type = object->type(); + auto method_info = m_ts.lookup_method(compile_time_type.base_type(), method_name); + method_info.type = method_info.type.substitute_for_method_call(compile_time_type.base_type()); + auto fe = get_parent_env_of_type(env); + + RegVal* runtime_type = nullptr; + if (is_basic(compile_time_type)) { + runtime_type = fe->make_gpr(m_ts.make_typespec("type")); + MemLoadInfo info; + info.size = 4; + info.sign_extend = false; + info.reg = RegKind::GPR_64; + env->emit(std::make_unique(runtime_type, -4, object, info)); + } else { + // can't look up at runtime + runtime_type = compile_get_symbol_value(compile_time_type.base_type(), env)->to_gpr(env); + } + + auto offset_of_method = get_offset_of_method(method_info.id); + MemLoadInfo load_info; + load_info.sign_extend = false; + load_info.size = POINTER_SIZE; + + auto loc_type = m_ts.make_pointer_typespec(method_info.type); + auto loc = fe->alloc_val(loc_type, runtime_type, offset_of_method); + auto di = m_ts.get_deref_info(loc_type); + assert(di.can_deref); + assert(di.mem_deref); + assert(di.sign_extend == false); + assert(di.load_size == 4); + + auto deref = fe->alloc_val(di.result_type, loc, MemLoadInfo(di)); + return deref->to_reg(env); +} + Val* Compiler::compile_deftype(const goos::Object& form, const goos::Object& rest, Env* env) { (void)form; (void)env; @@ -100,9 +147,11 @@ Val* Compiler::compile_defmethod(const goos::Object& form, const goos::Object& _ auto new_func_env = std::make_unique(env, lambda.debug_name); new_func_env->set_segment(MAIN_SEGMENT); // todo, how do we set debug? + new_func_env->method_of_type_name = symbol_string(type_name); // set up arguments assert(lambda.params.size() < 8); // todo graceful error + std::vector args_for_coloring; for (u32 i = 0; i < lambda.params.size(); i++) { IRegConstraint constr; constr.instr_idx = 0; // constraint at function start @@ -111,6 +160,7 @@ Val* Compiler::compile_defmethod(const goos::Object& form, const goos::Object& _ constr.desired_register = emitter::gRegInfo.get_arg_reg(i); new_func_env->params[lambda.params.at(i).name] = ireg; new_func_env->constrain(constr); + args_for_coloring.push_back(ireg); } place->func = new_func_env.get(); @@ -120,6 +170,7 @@ Val* Compiler::compile_defmethod(const goos::Object& form, const goos::Object& _ auto func_block_env = new_func_env->alloc_env(new_func_env.get(), "#f"); func_block_env->return_value = return_reg; func_block_env->end_label = Label(new_func_env.get()); + func_block_env->emit(std::make_unique(args_for_coloring)); // compile the function! Val* result = nullptr; @@ -135,13 +186,13 @@ Val* Compiler::compile_defmethod(const goos::Object& form, const goos::Object& _ if (result) { auto final_result = result->to_gpr(new_func_env.get()); new_func_env->emit(std::make_unique(return_reg, final_result)); - // new_func_env->emit(std::make_unique())??? - new_func_env->finish(); lambda_ts.add_arg(final_result->type()); } else { lambda_ts.add_arg(m_ts.make_typespec("none")); } func_block_env->end_label.idx = new_func_env->code().size(); + new_func_env->emit(std::make_unique()); + new_func_env->finish(); auto obj_env = get_parent_env_of_type(new_func_env.get()); assert(obj_env); @@ -150,7 +201,8 @@ Val* Compiler::compile_defmethod(const goos::Object& form, const goos::Object& _ } place->set_type(lambda_ts); - auto info = m_ts.add_method(symbol_string(type_name), symbol_string(method_name), lambda_ts); + auto info = + m_ts.add_method(symbol_string(type_name), symbol_string(method_name), lambda_ts, false); auto type_obj = compile_get_symbol_value(symbol_string(type_name), env)->to_gpr(env); auto id_val = compile_integer(info.id, env)->to_gpr(env); auto method_val = place->to_gpr(env); @@ -180,6 +232,7 @@ Val* Compiler::compile_deref(const goos::Object& form, const goos::Object& _rest if (deref_info.mem_deref) { result = fe->alloc_val(deref_info.result_type, result, MemLoadInfo(deref_info)); + result->mark_as_settable(); } else { assert(false); } @@ -208,8 +261,12 @@ Val* Compiler::compile_deref(const goos::Object& form, const goos::Object& _rest assert(di.can_deref); assert(di.mem_deref); result = fe->alloc_val(di.result_type, loc, MemLoadInfo(di)); + result->mark_as_settable(); } else { - assert(false); + result = fe->alloc_val(field.type, result, + field.field.offset() + offset); + result->mark_as_settable(); + // assert(false); } continue; } @@ -217,8 +274,169 @@ Val* Compiler::compile_deref(const goos::Object& form, const goos::Object& _rest // todo try bitfield } - // todo array or other - assert(false); + auto index_value = compile_error_guard(field_obj, env)->to_gpr(env); + if (!is_integer(index_value->type())) { + throw_compile_error(form, "cannot use -> with " + field_obj.print()); + } + + if (result->type().base_type() == "inline-array") { + assert(false); + } else if (result->type().base_type() == "pointer") { + auto di = m_ts.get_deref_info(result->type()); + auto base_type = di.result_type; + assert(di.mem_deref); + assert(di.can_deref); + auto offset = compile_integer(di.stride, env)->to_gpr(env); + // todo, check for integer and avoid runtime multiply + env->emit(std::make_unique(IntegerMathKind::IMUL_32, offset, index_value)); + auto loc = fe->alloc_val(result->type(), result, offset); + result = fe->alloc_val(di.result_type, loc, MemLoadInfo(di)); + result->mark_as_settable(); + } else { + throw_compile_error(form, "can't access array of type " + result->type().print()); + } } return result; -} \ No newline at end of file +} + +Val* Compiler::compile_addr_of(const goos::Object& form, const goos::Object& rest, Env* env) { + auto args = get_va(form, rest); + va_check(form, args, {{}}, {}); + auto loc = compile_error_guard(args.unnamed.at(0), env); + auto as_mem_deref = dynamic_cast(loc); + if (!as_mem_deref) { + throw_compile_error(form, "Cannot take the address of this"); + } + return as_mem_deref->base; +} + +Val* Compiler::compile_the_as(const goos::Object& form, const goos::Object& rest, Env* env) { + auto args = get_va(form, rest); + va_check(form, args, {{}, {}}, {}); + auto desired_ts = parse_typespec(args.unnamed.at(0)); + auto base = compile_error_guard(args.unnamed.at(1), env); + auto result = get_parent_env_of_type(env)->alloc_val(desired_ts, base); + if (base->settable()) { + result->mark_as_settable(); + } + return result; +} + +Val* Compiler::compile_the(const goos::Object& form, const goos::Object& rest, Env* env) { + auto args = get_va(form, rest); + va_check(form, args, {{}, {}}, {}); + auto desired_ts = parse_typespec(args.unnamed.at(0)); + auto base = compile_error_guard(args.unnamed.at(1), env); + + if (is_number(base->type())) { + if (m_ts.typecheck(m_ts.make_typespec("binteger"), desired_ts, "", false, false)) { + return number_to_binteger(base, env); + } + + if (m_ts.typecheck(m_ts.make_typespec("integer"), desired_ts, "", false, false)) { + auto result = number_to_integer(base, env); + result->set_type(desired_ts); + return result; + } + + if (m_ts.typecheck(m_ts.make_typespec("float"), desired_ts, "", false, false)) { + return number_to_float(base, env); + } + } + + auto result = get_parent_env_of_type(env)->alloc_val(desired_ts, base); + if (base->settable()) { + result->mark_as_settable(); + } + return result; +} + +Val* Compiler::compile_print_type(const goos::Object& form, const goos::Object& rest, Env* env) { + auto args = get_va(form, rest); + va_check(form, args, {{}}, {}); + fmt::print("[TYPE] {}\n", compile(args.unnamed.at(0), env)->type().print()); + return get_none(); +} + +Val* Compiler::compile_new(const goos::Object& form, const goos::Object& _rest, Env* env) { + auto allocation = quoted_sym_as_string(pair_car(_rest)); + auto rest = &pair_cdr(_rest); + + // auto type_of_obj = get_base_typespec(quoted_sym_as_string(pair_car(rest))); + auto type_as_string = quoted_sym_as_string(pair_car(*rest)); + rest = &pair_cdr(*rest); + + if (allocation == "global" || allocation == "debug") { + if (type_as_string == "inline-array") { + assert(false); + } else if (type_as_string == "array") { + assert(false); + } else { + auto type_of_obj = m_ts.make_typespec(type_as_string); + std::vector args; + // allocation + args.push_back(compile_get_sym_obj(allocation, env)->to_reg(env)); + // type + args.push_back(compile_get_symbol_value(type_of_obj.base_type(), env)->to_reg(env)); + // the other arguments + for_each_in_list(*rest, [&](const goos::Object& o) { + args.push_back(compile_error_guard(o, env)->to_reg(env)); + }); + + auto new_method = compile_get_method_of_type(type_of_obj, "new", env); + + auto new_obj = compile_real_function_call(form, new_method, args, env); + new_obj->set_type(type_of_obj); + return new_obj; + } + } else if (allocation == "static") { + assert(false); + } + + throw_compile_error(form, "unsupported new form"); + return get_none(); +} + +Val* Compiler::compile_car(const goos::Object& form, const goos::Object& rest, Env* env) { + auto args = get_va(form, rest); + va_check(form, args, {{}}, {}); + auto fe = get_parent_env_of_type(env); + auto pair = compile_error_guard(args.unnamed.at(0), env); + if (pair->type() != m_ts.make_typespec("object")) { + typecheck(form, m_ts.make_typespec("pair"), pair->type(), "Type of argument to car"); + } + auto result = fe->alloc_val(m_ts.make_typespec("object"), pair, true); + result->mark_as_settable(); + return result; +} + +Val* Compiler::compile_cdr(const goos::Object& form, const goos::Object& rest, Env* env) { + auto args = get_va(form, rest); + va_check(form, args, {{}}, {}); + auto fe = get_parent_env_of_type(env); + auto pair = compile_error_guard(args.unnamed.at(0), env); + if (pair->type() != m_ts.make_typespec("object")) { + typecheck(form, m_ts.make_typespec("pair"), pair->type(), "Type of argument to cdr"); + } + auto result = fe->alloc_val(m_ts.make_typespec("object"), pair, false); + result->mark_as_settable(); + return result; +} + +// todo, consider splitting into method-of-object and method-of-type? +Val* Compiler::compile_method(const goos::Object& form, const goos::Object& rest, Env* env) { + auto args = get_va(form, rest); + va_check(form, args, {{}, {goos::ObjectType::SYMBOL}}, {}); + + auto arg = args.unnamed.at(0); + auto method_name = symbol_string(args.unnamed.at(1)); + + if (arg.is_symbol()) { + if (m_ts.fully_defined_type_exists(symbol_string(arg))) { + return compile_get_method_of_type(m_ts.make_typespec(symbol_string(arg)), method_name, env); + } + } + + auto obj = compile_error_guard(arg, env)->to_gpr(env); + return compile_get_method_of_object(obj, method_name, env); +} diff --git a/goalc/emitter/IGen.h b/goalc/emitter/IGen.h index 8fe44f384a..219e1efd1d 100644 --- a/goalc/emitter/IGen.h +++ b/goalc/emitter/IGen.h @@ -1750,7 +1750,7 @@ class IGen { Instruction instr(0xf3); instr.set_op2(0x0f); instr.set_op3(0x2c); - instr.set_modrm_and_rex(dst.hw_id(), src.hw_id(), 3, false); + instr.set_modrm_and_rex(dst.hw_id(), src.hw_id(), 3, true); instr.swap_op0_rex(); return instr; } diff --git a/goalc/emitter/ObjectFileData.cpp b/goalc/emitter/ObjectFileData.cpp index 013dbb7ce6..cf338f4b8b 100644 --- a/goalc/emitter/ObjectFileData.cpp +++ b/goalc/emitter/ObjectFileData.cpp @@ -14,11 +14,11 @@ std::vector ObjectFileData::to_vector() const { // data (code + static objects, by segment) for (int seg = N_SEG; seg-- > 0;) { result.insert(result.end(), segment_data[seg].begin(), segment_data[seg].end()); - // printf("seg %d data\n", seg); - // for (auto x : segment_data[seg]) { - // printf("%02x ", x); - // } - // printf("\n"); + // printf("seg %d data\n", seg); + // for (auto x : segment_data[seg]) { + // printf("%02x ", x); + // } + // printf("\n"); } return result; } diff --git a/goalc/gs/goos-lib.gs b/goalc/gs/goos-lib.gs index dd6a9c8228..cc1daaf6e8 100644 --- a/goalc/gs/goos-lib.gs +++ b/goalc/gs/goos-lib.gs @@ -122,6 +122,10 @@ (defsmacro string? (x) `(type? 'string ,x)) +(defsmacro ferror (&rest args) + `(error (fmt #f ,@args)) + ) + ;; Bootstrap GOAL macro system diff --git a/goalc/logger/Logger.cpp b/goalc/logger/Logger.cpp index 63e3596d22..e49bebf783 100644 --- a/goalc/logger/Logger.cpp +++ b/goalc/logger/Logger.cpp @@ -58,6 +58,7 @@ void Logger::log(LoggerMessageKind kind, const char* format, ...) { if (settings.color != COLOR_NORMAL) { printf("\033[0m"); + fflush(stdout); } // todo, does this make things slow? diff --git a/goalc/main.cpp b/goalc/main.cpp index a01b20a3a0..bf9c4f563e 100644 --- a/goalc/main.cpp +++ b/goalc/main.cpp @@ -1,10 +1,11 @@ #include #include "goalc/compiler/Compiler.h" +#include "common/versions.h" int main(int argc, char** argv) { (void)argc; (void)argv; - printf("GOAL Compiler\n"); + printf("OpenGOAL Compiler %d.%d\n", versions::GOAL_VERSION_MAJOR, versions::GOAL_VERSION_MINOR); Compiler compiler; compiler.execute_repl(); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index cf38f56bf7..f2766d9bef 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -34,5 +34,5 @@ if(CMAKE_COMPILER_IS_GNUCXX AND CODE_COVERAGE) setup_target_for_coverage_lcov(NAME goalc-test_coverage EXECUTABLE goalc-test --gtest_color=yes DEPENDENCIES goalc-test - EXCLUDE "third-party/*" "/usr/include/*") + EXCLUDE "third-party/*" "/usr/include/*" "decompiler/*") endif() diff --git a/test/old_goal_tests/goal-compiler-control.gc b/test/old_goal_tests/goal-compiler-control.gc deleted file mode 100644 index dde63ac4ff..0000000000 --- a/test/old_goal_tests/goal-compiler-control.gc +++ /dev/null @@ -1,44 +0,0 @@ -;-*-Scheme-*- - -;; This file is loaded as part of goal-lib.gc. -;; It should generate no code. - -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; COMPILER CONTROL -;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; TODO change me!!! -(defglobalconstant *compiler-output-path* "obj/") - -;; a macro to compile the test file -(defmacro :t () - `(asm-file "game/test.gc" :color) - ) - -;; a macro to compile and load the test file -(defmacro :tl () - `(asm-file "game/test.gc" :color :load) - ) - -;; compile the gcommon code. -(defmacro :g () - ;`(asm-file "game/kernel/gcommon.gc" :color :write) - `(asm-file "game/kernel/gcommon.gc" :color) - ) - -;; compile and load the gcommon code. -(defmacro :gl () - `(begin - (asm-file "game/kernel/gcommon.gc" :color :load) - ) - ) - -;; compile, color, and save a file -(defmacro m (file) - `(asm-file ,file :color :write) - ) - -;; compile, color, load and save a file -(defmacro ml (file) - `(asm-file ,file :color :load :write) - ) \ No newline at end of file diff --git a/test/old_goal_tests/goal-constants.gc b/test/old_goal_tests/goal-constants.gc deleted file mode 100644 index 5f1688bfd1..0000000000 --- a/test/old_goal_tests/goal-constants.gc +++ /dev/null @@ -1,7 +0,0 @@ -;-*-Scheme-*- - -;; This file is loaded as part of goal-lib.gc. -;; It should generate no code. - -(defglobalconstant M_PI 3.1415926589932) -(defglobalconstant *gtype-basic-offset* 4) \ No newline at end of file diff --git a/test/old_goal_tests/goal-externs.gc b/test/old_goal_tests/goal-externs.gc deleted file mode 100644 index d3c84d54fe..0000000000 --- a/test/old_goal_tests/goal-externs.gc +++ /dev/null @@ -1,96 +0,0 @@ -;-*-Scheme-*- - -;; This file is loaded as part of goal-lib.gc. -;; It should generate no code. - -;; This is used to extern define all C Kernel functions and types. - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Forward declare C Kernel Fixed Syms -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; '() - -;; booleans -(define-extern #f boolean) -(define-extern #t boolean) - -;; types -(define-extern function type) -(define-extern symbol type) -(define-extern basic type) -(define-extern string type) -(define-extern type type) -(define-extern object type) -(define-extern link-block type) -(define-extern integer type) -(define-extern sinteger type) -(define-extern uinteger type) -(define-extern binteger type) -(define-extern int8 type) -(define-extern int16 type) -(define-extern int32 type) -(define-extern int64 type) -(define-extern int128 type) -(define-extern uint8 type) -(define-extern uint16 type) -(define-extern uint32 type) -(define-extern uint64 type) -(define-extern uint128 type) -(define-extern float type) -(define-extern process-tree type) -(define-extern process type) -(define-extern thread type) -(define-extern structure type) -(define-extern pair type) -(define-extern pointer type) -(define-extern number type) -(define-extern array type) -(define-extern vu-function type) -(define-extern connectable type) -(define-extern stack-frame type) -(define-extern file-stream type) -(define-extern kheap type) - -;; functions -(defun-extern nothing () none) -;; del basic -(define-extern static symbol) -(define-extern global object) -;;(define-extern debug kheap) -(define-extern loading-level symbol) -(define-extern loading-package symbol) -(define-extern process-level-heap symbol) -(define-extern stack symbol) -(define-extern scratch symbol) - -;;(define-extern *scratch-top* pointer) -(defun-extern zero-func () int32) -(defun-extern method-set! ((x type) (y integer) (z function)) object) -;; todo - change allocation to a kheap -(defun-extern dgo-load ((name string) (allocation object) (flag integer) (buffer-size integer)) none) - -(defun-extern *listener-function* () object) -(define-extern *enable-method-set* int32) -;; asizeo-of-bsic -;; copy-basic -;; level -;; art group -;; tx page dir -;; tx page -;; sound -;; dgo -;; top level - -(defun-extern string->symbol ((x string)) symbol) -(defun-extern print ((x object)) object) -(defun-extern inspect ((x object)) object) -(define-extern test-function function) -(define-extern _format function) -;; for the compiler -(define-extern format function) -;; TODO - some others... -(define-extern *kernel-boot-message* symbol) -(define-extern *debug-segment* boolean) - -;; for use by the compiler. -(defun-extern malloc ((allocation symbol) (size integer)) pointer) \ No newline at end of file diff --git a/test/old_goal_tests/goal-lib.gc b/test/old_goal_tests/goal-lib.gc deleted file mode 100644 index 5f794c3aff..0000000000 --- a/test/old_goal_tests/goal-lib.gc +++ /dev/null @@ -1,100 +0,0 @@ -;-*-Scheme-*- - -;; THE GOAL COMMON LIBRARY -;; before this is loaded into the compiler, GOOS needs to have loaded -;; goos-lib.gs. The goos-lib will insert some macros into GOAL's macro space -;; required for this to work. - -;; WARNING - this file should generate NO CODE! -;; Any code which would be generated by this file is thrown out without warning! -;; Any "common" code should go in gcommon instead. - -(asm-file "goal/gc/goal-test-defs.gc") -(asm-file "goal/gc/goal-target-control.gc") -(asm-file "goal/gc/goal-compiler-control.gc") -(asm-file "goal/gc/goal-syntax.gc") -(asm-file "goal/gc/goal-test-utils.gc") -(asm-file "goal/gc/goal-externs.gc") -(asm-file "goal/gc/goal-constants.gc") -(asm-file "goal/gc/goal-macros.gc") -(asm-file "builder/gc/builder.gc") - -;; Ideally this file only contains the above asm-file statements -;; but below is a good spot for temporary hacks: - - -;; HACKS! - -;; temp hack, this gets you the wrong type, and doesn't do good typechecking on the inputs -; (defmacro &+ (v1 v2) -; `(the pointer (+ (the integer ,v1) (the integer ,v2))) -; ) - -(defmacro &+ (v1 &rest args) - (if (null? args) - `(the pointer ,v1) - `(&+ (+ (the integer ,v1) (the integer ,(first args))) ,@(cdr args)) - ) - ) - -(defmacro &- (v1 v2) - `(the pointer (- (the integer ,v1) (the integer ,v2))) - ) - -(defmacro &+! (v1 v2) - `(set! ,v1 (&+ ,v1 ,v2)) - ) - -;; macro to print a float. -(defmacro pf (flt) - `(format #t "~f~%" ,flt) - ) - -(defmacro ct () - ;; compiler test - `(begin - (build-game) - (set! fancy-listener-print #f) - (test) - (set! fancy-listener-print #t) - ) - ) - -(defmacro tt () - `(begin - (lt) - (asm-file "game/test.gc" :color :load) - ) - ) - -(defmacro tn () - `(begin - (asm-file "game/test.gc" :color) - ) - ) - - -(defmacro lm () - `(begin - (build-game) - (asm-file "game/engine/math/math.gc" :color :load) - (set! fancy-listener-print #t) - ) - ) - -(defmacro lg () - `(begin - (dgo-load "game" global #xf #x200000) - )) - -(defmacro e () - `(:exit) - ) - -;(test) -;; uncomment to run tests automatically on startup. -;; Useful for running the compiler in GDB where you can't easily type stuff. -;;:(:t) -;(build-game) - -; (set-config! debug-print-obj #t) \ No newline at end of file diff --git a/test/old_goal_tests/goal-macros.gc b/test/old_goal_tests/goal-macros.gc deleted file mode 100644 index 084e350bbc..0000000000 --- a/test/old_goal_tests/goal-macros.gc +++ /dev/null @@ -1,23 +0,0 @@ -;-*-Scheme-*- - -;; This file is loaded as part of goal-lib.gc. -;; It should generate no code. - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; BIT STUFF -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defmacro align16 (value) - `(logand #xfffffff0 (+ (the integer ,value) 15)) - ) - -(defmacro &-> (&rest args) - `(& (-> ,@args)) - ) - -(defmacro new-with-method (alloc type &rest args) - `(the ,type ((-> ,type methods 0) ,alloc ,type ,@args)) - ) - -(defmacro symbol? (basic-obj) - `(eq? (-> ,basic-obj type) symbol) - ) diff --git a/test/old_goal_tests/goal-syntax.gc b/test/old_goal_tests/goal-syntax.gc deleted file mode 100644 index 3f92a86b63..0000000000 --- a/test/old_goal_tests/goal-syntax.gc +++ /dev/null @@ -1,355 +0,0 @@ -;-*-Scheme-*- - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; LEXICAL STUFF -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; Bind vars in body -(defmacro let (bindings &rest body) - `((lambda :inline-only #t ,(apply first bindings) ,@body) - ,@(apply second bindings))) - -;; Let, but recursive, allowing you to define variables in terms of others. -(defmacro let* (bindings &rest body) - (if (null? bindings) - `(begin ,@body) - `((lambda :inline-only #t (,(caar bindings)) - (let* ,(cdr bindings) ,@body)) - ,(car (cdar bindings)) - ) - ) - ) - -;; Backup some values, and restore after executing body. -;; Non-dynamic (nonlocal jumps out of body will skip restore) -(defmacro protect (defs &rest body) - (if (null? defs) - ;; nothing to backup, just insert body (base case) - `(begin ,@body) - - ;; a unique name for the thing we are backing up - (with-gensyms (backup) - ;; store the original value of the first def in backup - `(let ((,backup ,(first defs))) - ;; backup any other things which need backing up - (protect ,(cdr defs) - ;; execute the body - ,@body - ) - ;; restore the first thing - (set! ,(first defs) ,backup) - ) - ) - ) - ) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; DEFINE STUFF -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; Define a new function -(defmacro defun (name bindings &rest body) - (if (and - (> (length body) 1) ;; more than one thing in function - (string? (first body)) ;; first thing is a string - ) - ;; then it's a docstring and we ignore it. - `(define ,name (lambda :name ,name ,bindings ,@(cdr body))) - ;; otherwise don't ignore it. - `(define ,name (lambda :name ,name ,bindings ,@body)) - ) - ) - -;; Define a new function, but only if we're debugging. -;; TODO - should place the function in the debug segment! -(defmacro defun-debug (name &rest args) - `(if *debug-segment* - (defun ,name ,@args) ;; debug data is loaded, define function in symbol table - (define ,name nothing) ;; function not loaded, set function to the nothing function. - ) - ) - -;; By default, recursive functions don't work because the compiler doesn't -;; know the return type of a function until after the function is fully defined. -;; To get around this, this macro allows you to define a function + give a return type. -;; it simply forward declares the function with the given return, then defines the function as normal -;; if you got the return type wrong, the function definition conflicts with the forward dec -;; and throws an error. -(defmacro defun-recursive (name bindings return-type &rest body) - `(begin - (defun-extern ,name ,bindings ,return-type) - (define ,name (lambda :name ,name ,bindings - ;; omit the doc-string if needed - ,@(if (and (> (length body) 1) (string? (first body))) - (cdr body) - body - ) - ) - ) - ) - ) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; CONDITIONAL COMPILATION -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defmacro #when (clause &rest body) - `(#cond (,clause ,@body)) - ) - -(defmacro #unless (clause &rest body) - `(#cond ((not ,clause) ,@body)) - ) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; MATH STUFF -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defmacro +1 (var) - `(+ ,var 1) - ) - -(defmacro +! (place amount) - `(set! ,place (+ ,place ,amount)) - ) - -(defmacro +1! (place) - `(set! ,place (+ 1 ,place)) - ) - -(defmacro -! (place amount) - `(set! ,place (- ,place ,amount)) - ) - -(defmacro *! (place amount) - `(set! ,place (* ,place ,amount)) - ) - -(defmacro 1- (var) - `(- ,var 1) - ) - -(defmacro fabs (x) - `(if (> 0.0 ,x) (- ,x) ,x) - ) - -(defmacro fmin (a b) - `(if (> ,a ,b) ,b ,a) - ) - -(defmacro fmax (a b) - `(if (> ,a ,b) ,a ,b) - ) - - -(defmacro true! (place) - `(set! ,place #t) - ) - -(defmacro false! (place) - `(set! ,place #f) - ) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; CONTROL FLOW STUFF -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defmacro if (condition true-case &rest others) - (if (null? others) - `(cond (,condition ,true-case)) - `(cond (,condition ,true-case) - (else ,(first others)) - ) - ) - ) - -(defmacro when (condition &rest body) - `(if ,condition - (begin ,@body) - ) - ) - -(defmacro unless (condition &rest body) - `(if (not ,condition) - (begin ,@body) - ) - ) - - -; (defmacro while (test &rest body) -; (with-gensyms (reloop test-exit) -; `(begin -; (goto ,test-exit) -; (label ,reloop) -; ,@body -; (label ,test-exit) -; (when ,test -; (goto ,reloop) -; ) -; ) -; ) -; ) - -(defmacro while (test &rest body) - (with-gensyms (reloop test-exit) - `(begin - (goto ,test-exit) - (label ,reloop) - ,@body - (label ,test-exit) - (when-goto ,test ,reloop) - #f - ) - ) - ) - - -(defmacro and (&rest args) - (with-gensyms (result end) - `(begin - (let ((,result (the object #f))) - ,@(apply (lambda (x) - `(begin - (set! ,result ,x) - (if (eq? ,result #f) - (goto ,end) - ) - ) - ) - args - ) - (label ,end) - ,result - ) - ) - ) - ) - -(defmacro or (&rest args) - (with-gensyms (result end) - `(begin - (let ((,result (the object #f))) - ,@(apply (lambda (x) - `(begin - (set! ,result ,x) - (if (not (eq? ,result #f)) - (goto ,end) - ) - ) - ) - args - ) - (label ,end) - ,result - ) - ) - ) - ) - -(defmacro zero? (thing) - `(eq? ,thing 0) - ) - -(defmacro until (test &rest body) - (with-gensyms (reloop) - `(begin - (label ,reloop) - ,@body - (when-goto (not ,test) ,reloop) - ; (when (not ,test) - ; (goto ,reloop) - ; ) - ) - ) - ) - -(defmacro dotimes (var &rest body) - `(let (( ,(first var) 0)) - (while (< ,(first var) ,(second var)) - ,@body - (+1! ,(first var)) - ) - ,@(cddr var) - ) - ) - -(defmacro countdown (var &rest body) - `(let ((,(first var) ,(second var))) - (while (!= ,(first var) 0) - (set! ,(first var) (- ,(first var) 1)) - ,@body - ) - ) - ) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; TYPE STUFF -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defmacro basic? (obj) - ;; todo, make this more efficient - `(= 4 (logand (the integer ,obj) #b111)) - ) - -(defmacro pair? (obj) - ;; todo, make this more efficient - `(= 2 (logand (the integer ,obj) #b111)) - ) - -(defmacro binteger? (obj) - `(zero? (logand (the integer ,obj) #b111)) - ) - -(defmacro rtype-of (obj) - `(cond ((binteger? ,obj) binteger) - ((pair? ,obj) pair) - (else (-> (the basic ,obj) type)) - ) - ) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; PAIR STUFF -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - -(defmacro cons (a b) - `(new 'global 'pair ,a ,b) - ) - - -(defmacro list (&rest args) - (if (null? args) - (quote '()) - `(cons ,(car args) (list ,@(cdr args))) - ) - ) - -(defmacro null? (arg) - ;; todo, make this better - `(if (eq? ,arg '()) - #t - #f - ) - ) - -(defmacro caar (arg) - `(car (car ,arg)) - ) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; METHOD STUFF -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - -(defmacro object-new (&rest sz) - (if (null? sz) - `(the ,(current-method-type) ((-> object methods 0) allocation type-to-make (-> type-to-make asize))) - `(the ,(current-method-type) ((-> object methods 0) allocation type-to-make ,@sz)) - ) - ) - diff --git a/test/old_goal_tests/goal-target-control.gc b/test/old_goal_tests/goal-target-control.gc deleted file mode 100644 index c6deb56ff2..0000000000 --- a/test/old_goal_tests/goal-target-control.gc +++ /dev/null @@ -1,30 +0,0 @@ -;-*-Scheme-*- - -;; GOAL Macros for interfacing with the target. - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; TARGET CONTROL -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defmacro lt (&rest args) - ;; shortcut for listen-to-target. also sends a :status command to make sure - ;; all buffers on the target are flushed. - `(begin - (listen-to-target ,@args) - (:status) - ) - ) - -(defmacro :r (&rest args) - ;; shortcut to completely reset the target and connect, regardless of current state - `(begin - ;; connect, so we can send reset. if we're already connected, does nothing - (listen-to-target ,@args) - ;; send a reset message, disconnecting us - (reset-target) - ;; establish connection again - (listen-to-target ,@args) - ;; flush buffers - (:status) - ) - ) \ No newline at end of file diff --git a/test/old_goal_tests/goal-test-defs.gc b/test/old_goal_tests/goal-test-defs.gc deleted file mode 100644 index 61802d0c46..0000000000 --- a/test/old_goal_tests/goal-test-defs.gc +++ /dev/null @@ -1,134 +0,0 @@ -;; Definition of all GOAL tests - -(defglobalconstant *goal-test-prefix* "goal/gc/tests/") -(defglobalconstant *goal-test-files* - ( - "test-return-integer.gc" - "test-return-integer1.gc" - "test-return-integer2.gc" - "test-return-integer3.gc" - "test-return-integer4.gc" - "test-return-integer5.gc" - "test-return-integer6.gc" - "test-return-negative-integer.gc" - "test-conditional-compilation.gc" - "test-conditional-compilation-2.gc" - "test-define-1.gc" - "test-nested-blocks-1.gc" - ;; up to here has been hand-checked for good code. - - "test-nested-blocks-2.gc" - "test-nested-blocks-3.gc" - "test-goto-1.gc" - "test-defglobalconstant-1.gc" - "test-defglobalconstant-2.gc" - "test-simple-function-call.gc" - "test-application-lambda-1.gc" - "test-let-1.gc" - "test-let-star-1.gc" - "test-string-constant-1.gc" - "test-string-constant-2.gc" - "test-defun-return-constant.gc" - "test-defun-return-symbol.gc" - "test-function-return-arg-1.gc" - "test-nested-function-call.gc" - "test-add-int-constants.gc" - "test-add-int-vars.gc" - "test-add-int-multiple.gc" - "test-add-int-multiple-2.gc" - "test-add-function-returns.gc" - "test-sub-1.gc" - "test-sub-2.gc" - "test-mul-1.gc" - "test-declare-inline.gc" - "test-inline-call.gc" - "test-with-inline.gc" - "test-three-reg-add.gc" - "test-three-reg-sub.gc" - "test-three-reg-mult.gc" - "test-mlet.gc" - "test-set-symbol.gc" - "test-defun-extern.gc" - "test-defsmacro-defgmacro.gc" - "test-desfun.gc" - "test-factorial-recursive.gc" - "test-factorial-iterative.gc" - "test-div-1.gc" - "test-div-2.gc" - "test-protect.gc" - "test-shiftvs.gc" - "test-ash.gc" - "test-negative-integer-symbol.gc" - "test-mod.gc" - "test-nested-function-call-2.gc" - "test-load-gcommon.gc" - "test-quote-symbol.gc" - "test-min-max.gc" - "test-format-1.gc" - "test-float-product.gc" - "test-float-in-symbol.gc" - "test-function-return-constant-float.gc" - "test-float-function.gc" - "test-float-pow-function.gc" - "test-bfloat-1.gc" - "test-align16-1.gc" - "test-align16-2.gc" - "test-basic-type-check.gc" - "test-return-from-f.gc" - "test-return-from-f-tricky-color.gc" - "test-signed-int-compare.gc" - "test-condition-boolean.gc" - "test-return-value-of-if.gc" - "test-inline-array-field.gc" - "test-access-inline-array.gc" - "test-find-parent-method.gc" - "test-empty-pair.gc" - "test-pairp.gc" - "test-cons.gc" - "test-list.gc" - "test-car-cdr-get.gc" - "test-car-cdr-set.gc" - "test-nested-car-cdr-set.gc" - "test-dotimes.gc" - "test-ref.gc" - "test-pair-asize.gc" - "test-last.gc" - "test-pair-length.gc" - "test-member-1.gc" - "test-member-2.gc" - "test-assoc-1.gc" - "test-assoc-2.gc" - "test-assoce-1.gc" - "test-assoce-2.gc" - "test-append.gc" - "test-delete-list.gc" - "test-delete-car.gc" - "test-insert-cons.gc" - "test-sort.gc" - "test-new-inline-array-class.gc" - "test-pointer-as-array-numbers.gc" - "test-memcpy.gc" - "test-qmemcpy-down.gc" - "test-qmemcpy-up.gc" - "test-memset.gc" - "test-print-binteger.gc" - "test-type-arrays.gc" - "test-number-comparison.gc" - "test-approx-pi.gc" - "test-dynamic-type.gc" - "test-string-type.gc" - "test-new-string.gc" - "test-static-new-integer-field.gc" - "test-addr-of.gc" - "test-set-self.gc" - "test-asm-func.gc" - "test-methods.gc" - "test-bitfield-enums.gc" - "test-packed-inline-array.gc" - "test-fixed-shifts.gc" - "test-add-binteger.gc" - "test-bitfield-access.gc" - "test-bitfield-set1.gc" - ) - ) - diff --git a/test/old_goal_tests/goal-test-utils.gc b/test/old_goal_tests/goal-test-utils.gc deleted file mode 100644 index 3e97ab8e13..0000000000 --- a/test/old_goal_tests/goal-test-utils.gc +++ /dev/null @@ -1,39 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; COMPILER TEST -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -;; macro to set up the target and compiler for a test -(defmacro test-setup (expected-value reset-required) - `(begin - ;; first, reboot and connect - ;; this uses a "compile time" conditional, as (:r) does the reset when it is _compiled_. - ;; so we want to compile the (:r) only if the reset is wanted. - (#when ,reset-required (:r)) - ;; set expected value in GOOS - (seval (define *test-expected* ,expected-value)) - ;; make sure that *test-result* is an object to avoid typing errors with future tests. - (define-extern *test-result* object) - ) - ) - -(defmacro test-result (value) - value) - -(defmacro expect (v1 v2) - `(if (not (eq? ,v1 ,v2)) - (format #t "TEST FAILURE!~%") - ) - ) - -(defmacro expect-true (value) - `(if (not (eq? ,value #t)) - (format #t "TEST FAILTURE!~%") - ) - ) - - -(defmacro expect-false (value) - `(if (not (eq? ,value #f)) - (format #t "TEST FAILTURE!~%") - ) - ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-add-binteger.gc b/test/old_goal_tests/tests/test-add-binteger.gc deleted file mode 100644 index eda56a9418..0000000000 --- a/test/old_goal_tests/tests/test-add-binteger.gc +++ /dev/null @@ -1,3 +0,0 @@ -(test-setup -13 #f) - -(printl (+ (the binteger -3) -10)) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-add-function-returns.gc b/test/old_goal_tests/tests/test-add-function-returns.gc deleted file mode 100644 index d9122573c0..0000000000 --- a/test/old_goal_tests/tests/test-add-function-returns.gc +++ /dev/null @@ -1,23 +0,0 @@ - ;-*-Scheme-*- - -;; various functions which add numbers, called in a big sum. -(test-setup 21 #f) - -(defun return-one () - 1) - -(defun return-sum ((a integer) (b integer)) - (+ a b) - ) - -(defun return-plus-two ((in integer)) - (+ in 2) - ) - -(defun return-plus-three ((in integer)) - (+ 3 in) - ) - -(+ 2 (return-one) (return-plus-three 2) (return-plus-two 3) (return-sum 1 2) (return-plus-two 3)) - - diff --git a/test/old_goal_tests/tests/test-add-int-constants.gc b/test/old_goal_tests/tests/test-add-int-constants.gc deleted file mode 100644 index edfab6a487..0000000000 --- a/test/old_goal_tests/tests/test-add-int-constants.gc +++ /dev/null @@ -1,8 +0,0 @@ - ;-*-Scheme-*- - -;; add two constants together. -(test-setup 13 #f) - -(+ 15 -2) - - diff --git a/test/old_goal_tests/tests/test-add-int-multiple-2.gc b/test/old_goal_tests/tests/test-add-int-multiple-2.gc deleted file mode 100644 index 62fa5e54fb..0000000000 --- a/test/old_goal_tests/tests/test-add-int-multiple-2.gc +++ /dev/null @@ -1,19 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 15 #f) - -;; add a bunch of numbers together in a single function, in a strange order. - -(defun add-five-v2 ((a int32) (b int32) (c int32) (d int32) (e int32)) - (let* ((total-1 a) - (also-d d) - (total-2 (+ total-1 b)) - (total-3 (+ c total-2)) - ) - (+ total-3 e also-d) - ) - ) - -(add-five 1 2 3 4 5) - - diff --git a/test/old_goal_tests/tests/test-add-int-multiple.gc b/test/old_goal_tests/tests/test-add-int-multiple.gc deleted file mode 100644 index 59c2c87fe9..0000000000 --- a/test/old_goal_tests/tests/test-add-int-multiple.gc +++ /dev/null @@ -1,13 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 15 #f) - -;; add a bunch of numbers together in a single function. - -(defun add-five ((a integer) (b integer) (c integer) (d integer) (e integer)) - (+ c d (+ e a) b) - ) - -(add-five 1 2 3 4 5) - - diff --git a/test/old_goal_tests/tests/test-add-int-vars.gc b/test/old_goal_tests/tests/test-add-int-vars.gc deleted file mode 100644 index 5ed9660c1e..0000000000 --- a/test/old_goal_tests/tests/test-add-int-vars.gc +++ /dev/null @@ -1,13 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 7 #f) - -;; add two numbers in a function - -(defun add-two ((x integer) (y integer)) - (+ x y) - ) - -(add-two 3 4) - - diff --git a/test/old_goal_tests/tests/test-addr-of.gc b/test/old_goal_tests/tests/test-addr-of.gc deleted file mode 100644 index 8653a8f55b..0000000000 --- a/test/old_goal_tests/tests/test-addr-of.gc +++ /dev/null @@ -1,13 +0,0 @@ -(test-setup 4 #f) - -(deftype addr-of-test-type (basic) - ((v1 int32 :offset 4) - (arr int32 12 :offset 8) - ) - ) - -(let ((temp (new 'global 'addr-of-test-type))) - (expect-true (= 12 (- (the integer (&-> temp arr 1)) (the integer temp)))) - (- (the integer (&-> temp v1)) (the integer temp)) - ) - diff --git a/test/old_goal_tests/tests/test-align16-2.gc b/test/old_goal_tests/tests/test-align16-2.gc deleted file mode 100644 index 51fe37a536..0000000000 --- a/test/old_goal_tests/tests/test-align16-2.gc +++ /dev/null @@ -1,10 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 64 #f) - -(defun type-method-check ((obj type)) - (align16 (+ 28 (* 4 (-> obj num-methods)))) - ) - -(type-method-check integer) diff --git a/test/old_goal_tests/tests/test-application-lambda-1.gc b/test/old_goal_tests/tests/test-application-lambda-1.gc deleted file mode 100644 index d0afd51618..0000000000 --- a/test/old_goal_tests/tests/test-application-lambda-1.gc +++ /dev/null @@ -1,9 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 2 #f) - -;; test an immediate lambda which does not generate code. - -(define *test-result* - ((lambda :inline-only #t (x y z) y) 1 2 3)) -(test-result *test-result*) diff --git a/test/old_goal_tests/tests/test-ash.gc b/test/old_goal_tests/tests/test-ash.gc deleted file mode 100644 index bbe09f373e..0000000000 --- a/test/old_goal_tests/tests/test-ash.gc +++ /dev/null @@ -1,13 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 18 #f) - -(defun ash ((value integer) (shift-amount integer)) - (if (> shift-amount 0) - (shlv value shift-amount) - (sarv value (- shift-amount)) - ) - ) - -(+ (ash (+ 1 2) (/ 6 2)) (ash (- 12) (- 1))) - diff --git a/test/old_goal_tests/tests/test-asm-func.gc b/test/old_goal_tests/tests/test-asm-func.gc deleted file mode 100644 index cc6f0fc9f4..0000000000 --- a/test/old_goal_tests/tests/test-asm-func.gc +++ /dev/null @@ -1,19 +0,0 @@ -(test-setup 1234567 #f) - -(defun test-asm-function () - ;; enable asm-func mode (DANGER) - (declare (asm-func)) - ;; now we have no prologue/epilogue. - ;; most operations involving variables are unsafe. - - ;; create a "safe" variable which is the rax register - (rlet ((ret :reg rax :type integer)) - ;; set to a numeric constant - (set! ret 1234567) - ) - - ;; and do a return manually - (.ret) - ) - -(test-asm-function) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-bfloat-1.gc b/test/old_goal_tests/tests/test-bfloat-1.gc deleted file mode 100644 index 7ec25e845e..0000000000 --- a/test/old_goal_tests/tests/test-bfloat-1.gc +++ /dev/null @@ -1,35 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 1.2339 #f) - -;; awful hack to create a bfloat at #x6000000 -(define-extern hack-bfloat integer) -(define hack-bfloat (+ #x6000000 *gtype-basic-offset*)) -(define-extern hack-bfloat bfloat) - -;; we have to manually set the type field. -(set! (-> hack-bfloat type) bfloat) - -;; set the data field -(set! (-> hack-bfloat data) 1.234) - -(defun test-print-bfloat ((obj bfloat)) - (format #t "~f~%" (-> obj data)) - ) - -;; to make test pass -;;(format #t "~f~%" (-> hack-bfloat data)) -(test-print-bfloat hack-bfloat) - -;; try printing it as a basic (should use default basic printer) -(format #t "Here's a bfloat ~A~%" hack-bfloat) - -;; or access the field directly and print as float -(format #t "Here's (-> flt data) ~f~%" (-> hack-bfloat data)) - -;; or inspect it (compiler should generate this method -(format #t "Here's its inspect~%~I~%" hack-bfloat) - -(format #t "It's type is `~A`~%" (-> hack-bfloat type)) - - diff --git a/test/old_goal_tests/tests/test-bitfield-access.gc b/test/old_goal_tests/tests/test-bitfield-access.gc deleted file mode 100644 index 7b63adab8a..0000000000 --- a/test/old_goal_tests/tests/test-bitfield-access.gc +++ /dev/null @@ -1,24 +0,0 @@ -(test-setup 'fffffffffffff344f213ffffffffffffffff #f) - -(deftype test-bf-type (int32) - ((f1 int16) - (f2 uint8) - (f3 int8 :size 3) - (f4 uint8 :size 2) - (f5 int8 :size 2) - ) - ) - -(deftype test-bf-type2 (int64) - ((f1 int16) - (f2 uint8) - (f3 float) - ) - ) - -(let ((temp (the test-bf-type #xf9f2f344)) - (temp2 (the test-bf-type2 #x133f456789012345))) - (expect-true (< (fabs (- 1.7711 (+ 1.0 (-> temp2 f3)))) 0.002)) - ; (format #t "diff is ~f~%" (fabs (- 1.711 (+ 1.0 (-> temp2 f3))))) - (format #t "~X~X~X~X~X~%" (-> temp f1) (-> temp f2) (-> temp f3) (-> temp f4) (-> temp f5)) - ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-bitfield-enums.gc b/test/old_goal_tests/tests/test-bitfield-enums.gc deleted file mode 100644 index 535c2f98ee..0000000000 --- a/test/old_goal_tests/tests/test-bitfield-enums.gc +++ /dev/null @@ -1,9 +0,0 @@ -(test-setup 5 #f) - -(defenum test-bitfield :bitfield #t - (one 0) - (two 1) - (four 2) - ) - -(test-bitfield one four) diff --git a/test/old_goal_tests/tests/test-bitfield-set1.gc b/test/old_goal_tests/tests/test-bitfield-set1.gc deleted file mode 100644 index 80cfae8aca..0000000000 --- a/test/old_goal_tests/tests/test-bitfield-set1.gc +++ /dev/null @@ -1,20 +0,0 @@ -(test-setup 50.3432 #f) - -(deftype test-bf-type3 (int64) - ((f1 uint16 :offset-assert 0) - (f2 uint8 :size 7 :offset-assert 16) - (f3 float :offset-assert 23) - (f4 uint8 :size 1 :offset-assert 55) - (f5 uint8 :offset-assert 56) - ) - ) - -(let ((temp (the test-bf-type3 #x0))) - (set! (-> temp f1) #x12) - (set! (-> temp f2) #x13) - (set! (-> temp f3) 12.3433) - (set! (-> temp f4) #xffffffff) ; will get truncated. - (expect-true (eq? 0 (-> temp f5))) ; check it gets truncated - (format #t "~f~%" (+ (-> temp f3) (-> temp f2) (-> temp f1) (-> temp f4))) - ) - diff --git a/test/old_goal_tests/tests/test-car-cdr-set.gc b/test/old_goal_tests/tests/test-car-cdr-set.gc deleted file mode 100644 index d909aa22bf..0000000000 --- a/test/old_goal_tests/tests/test-car-cdr-set.gc +++ /dev/null @@ -1,10 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 'cd #f) - -(let ((my-pair (cons 'a 'b))) - (set! (car my-pair) 'c) - (set! (cdr my-pair) 'd) - (format #t "~A~A~%" (car my-pair) (cdr my-pair)) - ) diff --git a/test/old_goal_tests/tests/test-conditional-compilation-2.gc b/test/old_goal_tests/tests/test-conditional-compilation-2.gc deleted file mode 100644 index 0e2fb675ff..0000000000 --- a/test/old_goal_tests/tests/test-conditional-compilation-2.gc +++ /dev/null @@ -1,9 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 5 #f) - -;; test the #when and #unless macros - - -(#unless (< 1 2) (/ 0 0)) -(#when (< 1 2) 5) diff --git a/test/old_goal_tests/tests/test-conditional-compilation.gc b/test/old_goal_tests/tests/test-conditional-compilation.gc deleted file mode 100644 index bc540bdfe9..0000000000 --- a/test/old_goal_tests/tests/test-conditional-compilation.gc +++ /dev/null @@ -1,15 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 3 #f) - -;; test the use of #cond to evaluate goos expressions. - -(#cond - ((> 2 (+ 2 1)) - 1 - ) - - ((< 2 (+ 1 2)) - 3 - ) - ) diff --git a/test/old_goal_tests/tests/test-cons.gc b/test/old_goal_tests/tests/test-cons.gc deleted file mode 100644 index 0564d6f1b7..0000000000 --- a/test/old_goal_tests/tests/test-cons.gc +++ /dev/null @@ -1,7 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup '(a) #f) - -(printl (cons 'a '())) - diff --git a/test/old_goal_tests/tests/test-declare-inline.gc b/test/old_goal_tests/tests/test-declare-inline.gc deleted file mode 100644 index bdda018731..0000000000 --- a/test/old_goal_tests/tests/test-declare-inline.gc +++ /dev/null @@ -1,14 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 32 #f) - -;; test calling an inline function. doesn't actually verify the call is inline. - -(defun inline-test-function-1 ((x integer)) - ;; inline this function by default. - (declare (inline)) - (* 4 x) - ) - -(inline-test-function-1 8) diff --git a/test/old_goal_tests/tests/test-defglobalconstant-1.gc b/test/old_goal_tests/tests/test-defglobalconstant-1.gc deleted file mode 100644 index 76698c449e..0000000000 --- a/test/old_goal_tests/tests/test-defglobalconstant-1.gc +++ /dev/null @@ -1,12 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 17 #f) - -;; test defglobalconstant to define a goal constant - -(defglobalconstant my-constant 12) -(defglobalconstant my-constant 17) -(defglobalconstant not-my-consant 13) - -my-constant diff --git a/test/old_goal_tests/tests/test-defglobalconstant-2.gc b/test/old_goal_tests/tests/test-defglobalconstant-2.gc deleted file mode 100644 index 9e5d01abe3..0000000000 --- a/test/old_goal_tests/tests/test-defglobalconstant-2.gc +++ /dev/null @@ -1,15 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 18 #f) - -;; test defglobalconstant to get a goos constant - -(defmacro get-goos-by-name (name) - ;; do the lookup in the goos global environment - (eval name) - ) - -(defglobalconstant my-constant 18) - -(get-goos-by-name my-constant) diff --git a/test/old_goal_tests/tests/test-define-1.gc b/test/old_goal_tests/tests/test-define-1.gc deleted file mode 100644 index 8fff7f7aac..0000000000 --- a/test/old_goal_tests/tests/test-define-1.gc +++ /dev/null @@ -1,17 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 17 #f) - -;; test the use of define. - -(define first-var 1) -(define second-var 2) -(define first-var 12) - -(begin - (define first-var 13) - (define second-var 12) - (define first-var 17) - second-var - first-var) diff --git a/test/old_goal_tests/tests/test-defsmacro-defgmacro.gc b/test/old_goal_tests/tests/test-defsmacro-defgmacro.gc deleted file mode 100644 index 2124eeff15..0000000000 --- a/test/old_goal_tests/tests/test-defsmacro-defgmacro.gc +++ /dev/null @@ -1,19 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 20 #f) - -(defsmacro test-macro (x) - ;; goos macro - `(+ ,x 2) - ) - -(defmacro test-macro (x) - ;; goal macro which calls a goos macro of the same name - (let ((goos-expansion (test-macro x))) - `(+ ,goos-expansion 3) - ) - ) - -(test-macro 15) - - diff --git a/test/old_goal_tests/tests/test-defun-extern.gc b/test/old_goal_tests/tests/test-defun-extern.gc deleted file mode 100644 index 1d30cdf3e1..0000000000 --- a/test/old_goal_tests/tests/test-defun-extern.gc +++ /dev/null @@ -1,7 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 12345 #f) - -;; this should be defun-extern'd in goal-lib.gc -;; and the function is a C Kernel function. -(+ (zero-func) 12345) diff --git a/test/old_goal_tests/tests/test-defun-return-constant.gc b/test/old_goal_tests/tests/test-defun-return-constant.gc deleted file mode 100644 index 14215deef2..0000000000 --- a/test/old_goal_tests/tests/test-defun-return-constant.gc +++ /dev/null @@ -1,16 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 12 #f) - -(defun return-13 () - 13) - -(defun return-12 () - 12) - -(defun return-11 () - 11) - -(return-12) - - diff --git a/test/old_goal_tests/tests/test-defun-return-symbol.gc b/test/old_goal_tests/tests/test-defun-return-symbol.gc deleted file mode 100644 index 0174ef2eab..0000000000 --- a/test/old_goal_tests/tests/test-defun-return-symbol.gc +++ /dev/null @@ -1,14 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 42 #f) - - - -(define my-number 36) - -(defun return-my-number () - my-number) - -(define my-number 42) - -(return-my-number) diff --git a/test/old_goal_tests/tests/test-desfun.gc b/test/old_goal_tests/tests/test-desfun.gc deleted file mode 100644 index 951552746a..0000000000 --- a/test/old_goal_tests/tests/test-desfun.gc +++ /dev/null @@ -1,15 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 4 #f) - -(desfun square (x) - (* x x) - ) - - -(defmacro call-square (x) - (square x) - ) - -(call-square 2) diff --git a/test/old_goal_tests/tests/test-div-1.gc b/test/old_goal_tests/tests/test-div-1.gc deleted file mode 100644 index cf3c9c32c1..0000000000 --- a/test/old_goal_tests/tests/test-div-1.gc +++ /dev/null @@ -1,6 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 6 #f) - -(+ 1 2 (/ (* 2 5) (+ 1 2))) - diff --git a/test/old_goal_tests/tests/test-div-2.gc b/test/old_goal_tests/tests/test-div-2.gc deleted file mode 100644 index 603bef96c0..0000000000 --- a/test/old_goal_tests/tests/test-div-2.gc +++ /dev/null @@ -1,14 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 7 #f) - -;; this computes nothing that we can check, but verifies that the coloring -;; doesn't do something crazy when constrained a little strangely -(rlet ((x :reg rsp :type int64)) - (/ x 2) - (/ 2 x) - ) - -(let ((x 30)) - (+ (/ x 10) 4) - ) diff --git a/test/old_goal_tests/tests/test-empty-pair.gc b/test/old_goal_tests/tests/test-empty-pair.gc deleted file mode 100644 index 01fa363089..0000000000 --- a/test/old_goal_tests/tests/test-empty-pair.gc +++ /dev/null @@ -1,6 +0,0 @@ - ;-*-Scheme-*- - -(test-setup '() #f) - -(print '()) -(format #t "~%") diff --git a/test/old_goal_tests/tests/test-factorial-iterative.gc b/test/old_goal_tests/tests/test-factorial-iterative.gc deleted file mode 100644 index c8fb3f43d2..0000000000 --- a/test/old_goal_tests/tests/test-factorial-iterative.gc +++ /dev/null @@ -1,15 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 3628800 #f) - -(defun factorial-iterative ((x integer)) - (let ((result 1)) - (while (!= x 1) - (set! result (* result x)) - (set! x (- x 1)) - ) - result - ) - ) - -(factorial-iterative 10) diff --git a/test/old_goal_tests/tests/test-factorial-recursive.gc b/test/old_goal_tests/tests/test-factorial-recursive.gc deleted file mode 100644 index 559eb7cfed..0000000000 --- a/test/old_goal_tests/tests/test-factorial-recursive.gc +++ /dev/null @@ -1,15 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 3628800 #f) - -;; for now, recursive functions need to forward declare so they have their -;; return type. -(defun-extern factorial-recursive ((x integer)) integer) - -(defun factorial-recursive ((x integer)) - (cond ((= x 1) x) - (else (* x (factorial-recursive (- x 1)))) - ) - ) - -(factorial-recursive 10) diff --git a/test/old_goal_tests/tests/test-fixed-shifts.gc b/test/old_goal_tests/tests/test-fixed-shifts.gc deleted file mode 100644 index e84d3cd666..0000000000 --- a/test/old_goal_tests/tests/test-fixed-shifts.gc +++ /dev/null @@ -1,4 +0,0 @@ -(test-setup 4611686018427387914 #f) - -(+ (shl 2 3) (shl 1 0) (shl 0 4) (shr 2 3) (shr 10 2) (shl -2 1) (sar -16 2) (shr -1 2)) -;; 16 1 0 0 2 -4 -4 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-float-function.gc b/test/old_goal_tests/tests/test-float-function.gc deleted file mode 100644 index 596ccee968..0000000000 --- a/test/old_goal_tests/tests/test-float-function.gc +++ /dev/null @@ -1,12 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 10.152 #f) - - -(defun float-testing-function ((x float) (y float)) - (* x y (* x x)) - ) - -(let ((x (float-testing-function (* 1.2 1.2) 3.4))) - (format #t "~,,3f~%" x) - ) diff --git a/test/old_goal_tests/tests/test-float-in-symbol.gc b/test/old_goal_tests/tests/test-float-in-symbol.gc deleted file mode 100644 index 4df1895272..0000000000 --- a/test/old_goal_tests/tests/test-float-in-symbol.gc +++ /dev/null @@ -1,6 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 2345.0 #f) -(define float-symbol 2345.0) -(format #t "~,,0f~%" float-symbol) - diff --git a/test/old_goal_tests/tests/test-float-pow-function.gc b/test/old_goal_tests/tests/test-float-pow-function.gc deleted file mode 100644 index 433b1c0168..0000000000 --- a/test/old_goal_tests/tests/test-float-pow-function.gc +++ /dev/null @@ -1,15 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 256 #f) - -(defun pow-test ((base float) (exponent integer)) - (let ((result base)) - (while (> exponent 1) - (*! result base) - (-! exponent 1) - ) - result - ) - ) - -(format #t "~,,0f~%" (pow-test 2.0 8)) diff --git a/test/old_goal_tests/tests/test-float-product.gc b/test/old_goal_tests/tests/test-float-product.gc deleted file mode 100644 index 502d6506e9..0000000000 --- a/test/old_goal_tests/tests/test-float-product.gc +++ /dev/null @@ -1,6 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 120.000 #f) - -(format #t "~,,0f~%" (* 1.2 25.0 4.0)) - diff --git a/test/old_goal_tests/tests/test-format-1.gc b/test/old_goal_tests/tests/test-format-1.gc deleted file mode 100644 index 95fbc6ff48..0000000000 --- a/test/old_goal_tests/tests/test-format-1.gc +++ /dev/null @@ -1,61 +0,0 @@ -;-*-Scheme-*- - - - -(test-setup 'automatic-pass #f) - -(format #t "test newline~%newline~%") -(format #t "test tilde ~~ ~%") - -;; test g, G - -(format #t "test A print boxed-string: ~a~%" "boxed string!") -(format #t "test A print symbol: ~A~%" 'a-symbol) -(format #t "test A make boxed object longer: ~17A!~%" "srt") -(format #t "test A non-default pad: ~12,'za~%" 'pad-me) -(format #t "test A shorten(4): ~4a~%" 'a234567) -(format #t "test A don'tchange(4): ~4a~%" 'a234) -(format #t "test A shorten with pad(4): ~4,'za~%" 'shorten-me) -(format #t "test A a few things ~a ~a ~a ~a~%" "one thing" 'a-second integer print) - - -(format #t "test S ~s ~s ~s~%" "a string" 'a-symbol "another string!") - -(format #t "test C ~c ~c~%" 41 #x5d) - -(format #t "test P (no type) ~p~%" print) -(format #t "test P (with type) ~`integer`p~%" print) - -(format #t "test I (no type) ~i" inspect) -(format #t "test I (with type) ~`integer`i" inspect) - -(format #t "test X ~x ~10x ~10,'.x ~3x ~3,'.x~%" #xbaadbeef #x2 #x3 #x0badbeef #x0badbeef) - -(format #t "test D ~d ~10d ~10,'.d ~3d ~3,'.d~%" #xbaadbeef #x2 #x3 #x0badbeef #x0badbeef) - -(format #t "test B ~b ~10b ~10,'.b ~3b ~3,'.b~%" #xbaadbeef #x2 #x3 #x0badbeef #x0badbeef) - -;; test f, F, r, R, m, M - -(format #t "test E ~E ~e ~e~%" 1 20 301) -(format #t "test pass through ~10,'b,2W~%") - -(format #t "test tab~Taftertab~%") -(format #t "test many ~d ~d ~d ~d ~d~%" 1 2 3 4 5) - - -;; test floats -(format #t "test f ~F ~12,'0,2f ~f~%" -1.234 1.234 -1.234) -(format #t "test r ~R ~12,'0,2r ~r~%" 1.234 1.567 1.987) -(format #t "test m ~M ~12,'0,2m ~m~%" 1.234 1.567 1.987) -(format #t "test as float ~`float`P~%" -99987623.23123) -(format #t "test pi! ~f~%" M_PI) - -;; print the stack pointer? -(rlet ((sp :reg rsp :type integer) - (off :reg r14 :type integer) - (st :reg r15 :type integer)) - (format #t "stack pointer is #x~x~%" sp) - (format #t "offset pointer is #x~x~%" off) - (format #t "st pointer is #x~x~%" st) - ) diff --git a/test/old_goal_tests/tests/test-function-return-arg-1.gc b/test/old_goal_tests/tests/test-function-return-arg-1.gc deleted file mode 100644 index 7b67583f77..0000000000 --- a/test/old_goal_tests/tests/test-function-return-arg-1.gc +++ /dev/null @@ -1,11 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 23 #f) - -(defun return-second-arg (one two three) - two) - -(return-second-arg 1 23 4) - - diff --git a/test/old_goal_tests/tests/test-function-return-constant-float.gc b/test/old_goal_tests/tests/test-function-return-constant-float.gc deleted file mode 100644 index cd8866b434..0000000000 --- a/test/old_goal_tests/tests/test-function-return-constant-float.gc +++ /dev/null @@ -1,9 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 31415.0 #f) - -(defun return-const-float () - 31415.0 - ) -(format #t "~,,0f~%" (return-const-float)) - diff --git a/test/old_goal_tests/tests/test-goto-1.gc b/test/old_goal_tests/tests/test-goto-1.gc deleted file mode 100644 index 918e001067..0000000000 --- a/test/old_goal_tests/tests/test-goto-1.gc +++ /dev/null @@ -1,12 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 3 #f) - -(block my-block - 1 - (goto skip-early-return) - (return-from my-block 2) - (label skip-early-return) - 3 - ) diff --git a/test/old_goal_tests/tests/test-inline-array-field.gc b/test/old_goal_tests/tests/test-inline-array-field.gc deleted file mode 100644 index 3d48627098..0000000000 --- a/test/old_goal_tests/tests/test-inline-array-field.gc +++ /dev/null @@ -1,11 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 16 #f) - -(let* ((base (the integer integer)) - (field (the integer (-> integer methods))) - (offset (- field base))) - ;;(format #t "offset of methods table is ~d~%" offset) - offset - ) diff --git a/test/old_goal_tests/tests/test-inline-call.gc b/test/old_goal_tests/tests/test-inline-call.gc deleted file mode 100644 index 56945e5bb0..0000000000 --- a/test/old_goal_tests/tests/test-inline-call.gc +++ /dev/null @@ -1,14 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 44 #f) - -;; test calling an inline function. doesn't actually verify the call is inline. - -(defun inline-test-function-2 ((x integer)) - ;; inline this function by default. - (declare (allow-inline)) - (* 4 x) - ) - -(+ (inline-test-function-2 8) ((inline inline-test-function-2) 3)) diff --git a/test/old_goal_tests/tests/test-let-1.gc b/test/old_goal_tests/tests/test-let-1.gc deleted file mode 100644 index 75b1e673e1..0000000000 --- a/test/old_goal_tests/tests/test-let-1.gc +++ /dev/null @@ -1,10 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 30 #f) -(define *test-result* - (let ((x 1) - (y (test-function 1 2 3 4)) - (z 3)) - y) - ) -(test-result *test-result*) diff --git a/test/old_goal_tests/tests/test-let-star-1.gc b/test/old_goal_tests/tests/test-let-star-1.gc deleted file mode 100644 index eed9a53835..0000000000 --- a/test/old_goal_tests/tests/test-let-star-1.gc +++ /dev/null @@ -1,15 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 30 #f) -(define *test-result* - (let* ((x 1) - (y 2) - (z 3) - (a 4) - (b (test-function x y z a)) - (d 5) - ) - b - ) - ) -(test-result *test-result*) diff --git a/test/old_goal_tests/tests/test-list.gc b/test/old_goal_tests/tests/test-list.gc deleted file mode 100644 index 0edd68ea60..0000000000 --- a/test/old_goal_tests/tests/test-list.gc +++ /dev/null @@ -1,7 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup '(a b c d) #f) - -(print (list 'a 'b 'c 'd)) -(format #t "~%") diff --git a/test/old_goal_tests/tests/test-load-gcommon.gc b/test/old_goal_tests/tests/test-load-gcommon.gc deleted file mode 100644 index af516bee71..0000000000 --- a/test/old_goal_tests/tests/test-load-gcommon.gc +++ /dev/null @@ -1,5 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 'automatic-pass #f) - -(:gl) diff --git a/test/old_goal_tests/tests/test-methods.gc b/test/old_goal_tests/tests/test-methods.gc deleted file mode 100644 index c9a5a6846d..0000000000 --- a/test/old_goal_tests/tests/test-methods.gc +++ /dev/null @@ -1,8 +0,0 @@ - -(test-setup 12 #f) - -(expect-true (eq? (-> process methods 3) (method process inspect))) - -(expect-true (eq? (-> string methods 3) (method "test" inspect))) - -12 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-min-max.gc b/test/old_goal_tests/tests/test-min-max.gc deleted file mode 100644 index 29e6a1b945..0000000000 --- a/test/old_goal_tests/tests/test-min-max.gc +++ /dev/null @@ -1,6 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 10 #f) - -(+ (min 1 2) (min 2 -4) (max 10 2) (max 3 1)) diff --git a/test/old_goal_tests/tests/test-mlet.gc b/test/old_goal_tests/tests/test-mlet.gc deleted file mode 100644 index 28c364cbbc..0000000000 --- a/test/old_goal_tests/tests/test-mlet.gc +++ /dev/null @@ -1,11 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 10 #f) - -(defglobalconstant c1 3) - -(+ c1 (mlet ((c1 4)) - c1 - ) - c1 - ) diff --git a/test/old_goal_tests/tests/test-mod.gc b/test/old_goal_tests/tests/test-mod.gc deleted file mode 100644 index 9acc7bc16f..0000000000 --- a/test/old_goal_tests/tests/test-mod.gc +++ /dev/null @@ -1,14 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 7 #f) - -;; this computes nothing that we can check, but verifies that the coloring -;; doesn't do something crazy when constrained a little strangely -(rlet ((x :reg rsp :type int64)) - (mod x 2) - (mod 2 x) - ) - -(let ((x 33)) - (+ (mod x 10) 4) - ) diff --git a/test/old_goal_tests/tests/test-mul-1.gc b/test/old_goal_tests/tests/test-mul-1.gc deleted file mode 100644 index 77042112d4..0000000000 --- a/test/old_goal_tests/tests/test-mul-1.gc +++ /dev/null @@ -1,11 +0,0 @@ - ;-*-Scheme-*- - -(test-setup -12 #f) - -(defun product ((a integer) (b integer)) - (* b a) - ) - -(product 4 -3) - - diff --git a/test/old_goal_tests/tests/test-negative-integer-symbol.gc b/test/old_goal_tests/tests/test-negative-integer-symbol.gc deleted file mode 100644 index 5ab38699e1..0000000000 --- a/test/old_goal_tests/tests/test-negative-integer-symbol.gc +++ /dev/null @@ -1,7 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup -123 #f) - -(define a-negative-symbol -123) -a-negative-symbol diff --git a/test/old_goal_tests/tests/test-nested-blocks-1.gc b/test/old_goal_tests/tests/test-nested-blocks-1.gc deleted file mode 100644 index 7c07a89b55..0000000000 --- a/test/old_goal_tests/tests/test-nested-blocks-1.gc +++ /dev/null @@ -1,22 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 7 #f) - -(block outer-block - 1 - 2 - (block inner-block - 3 - 4 - (return-from inner-block 7) - 5 - 6 - ) - ) - -;; with v1. const prop and fancy coloring: -; 0: b8 07 00 00 00 mov eax,0x7 -; 5: e9 05 00 00 00 jmp 0xf -; a: b8 06 00 00 00 mov eax,0x6 -; f: c3 ret diff --git a/test/old_goal_tests/tests/test-nested-blocks-2.gc b/test/old_goal_tests/tests/test-nested-blocks-2.gc deleted file mode 100644 index cc219664ef..0000000000 --- a/test/old_goal_tests/tests/test-nested-blocks-2.gc +++ /dev/null @@ -1,16 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 8 #f) - -(block outer-block - 1 - 2 - (block inner-block - 3 - 4 - (return-from inner-block 7) - 5 - ) - 8 - ) diff --git a/test/old_goal_tests/tests/test-nested-blocks-3.gc b/test/old_goal_tests/tests/test-nested-blocks-3.gc deleted file mode 100644 index d01fdc3168..0000000000 --- a/test/old_goal_tests/tests/test-nested-blocks-3.gc +++ /dev/null @@ -1,16 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 7 #f) - -(block outer-block - 1 - 2 - (block inner-block - 3 - 4 - (return-from outer-block 7) - 5 - ) - 8 - ) diff --git a/test/old_goal_tests/tests/test-nested-function-call-2.gc b/test/old_goal_tests/tests/test-nested-function-call-2.gc deleted file mode 100644 index 003f8fefdd..0000000000 --- a/test/old_goal_tests/tests/test-nested-function-call-2.gc +++ /dev/null @@ -1,23 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 10 #f) - -;; by putting some more functions, we make sure that branches in functions -;; in later functions actually are using the right stuff -(defun first-function ((a integer)) - (+ a 2) - (+ a 3) - (+ a 4) - (+ a 6) - (+ a 10) - ) - -(defun second-function ((b integer)) - (if (> 2 b) - 0 - 10 - ) - ) - -(second-function (second-function (second-function 3))) diff --git a/test/old_goal_tests/tests/test-nested-function-call.gc b/test/old_goal_tests/tests/test-nested-function-call.gc deleted file mode 100644 index 0420d5e7b1..0000000000 --- a/test/old_goal_tests/tests/test-nested-function-call.gc +++ /dev/null @@ -1,14 +0,0 @@ - ;-*-Scheme-*- - -;; this is mostly to test that the coloring works. -(test-setup 2 #f) - -(defun r2 (one two three) - two) - -(defun r1 (one two three) - one) - - -(r2 1 (r1 2 3 4) 5) - diff --git a/test/old_goal_tests/tests/test-new-inline-array-class.gc b/test/old_goal_tests/tests/test-new-inline-array-class.gc deleted file mode 100644 index 13c3a2baea..0000000000 --- a/test/old_goal_tests/tests/test-new-inline-array-class.gc +++ /dev/null @@ -1,20 +0,0 @@ -(test-setup 2820 #f) - -(deftype my-inline-array-type (inline-array-class) - () - ) - -(set! (-> my-inline-array-type heap-base) 12) - -(let ((my-inline-array-obj - (the my-inline-array-type - ((-> my-inline-array-type methods 0) - 'debug - my-inline-array-type - 234)))) - ;;(-> my-inline-array-obj allocated-length) - (asize-of my-inline-array-obj) - ;;(inspect my-inline-array-type) - ;;(inspect my-inline-array-obj) - ;;(print-type my-inline-array-obj) - ) diff --git a/test/old_goal_tests/tests/test-new-string.gc b/test/old_goal_tests/tests/test-new-string.gc deleted file mode 100644 index 32f35de1d0..0000000000 --- a/test/old_goal_tests/tests/test-new-string.gc +++ /dev/null @@ -1,7 +0,0 @@ -(test-setup "alligator" #f) - -(let ((new-string (new 'global 'string 17 "alligator"))) - (expect-true (= 17 (-> new-string allocated-length))) - (expect-true (= 9 (length new-string))) - (printl new-string) - ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-packed-inline-array.gc b/test/old_goal_tests/tests/test-packed-inline-array.gc deleted file mode 100644 index 7a02863465..0000000000 --- a/test/old_goal_tests/tests/test-packed-inline-array.gc +++ /dev/null @@ -1,30 +0,0 @@ -(test-setup 16 #f) - -(deftype small-struct-packed (structure) - ((v1 int32) - (v2 int32) - (v3 int32)) - (:pack) - ) - -(deftype small-struct (structure) - ((v1 int32) - (v2 int32) - (v3 int32)) - (:no-pack) - ) - -(deftype test-struct-type (basic) - ((packed small-struct-packed 10 :inline #t) - (not-packed small-struct 10 :inline #t) - ) - ) - -(let* ((obj (new 'static 'test-struct-type)) - (pack-diff (- (the integer (&-> obj packed 1 v1)) (the integer (&-> obj packed 0 v1)))) - (unpack-diff (- (the integer (&-> obj not-packed 1 v1)) (the integer (&-> obj not-packed 0 v1)))) - ) - - (expect-true (eq? 12 pack-diff)) - unpack-diff - ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-pair-asize.gc b/test/old_goal_tests/tests/test-pair-asize.gc deleted file mode 100644 index d38ed89c00..0000000000 --- a/test/old_goal_tests/tests/test-pair-asize.gc +++ /dev/null @@ -1,7 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 8 #f) -(let ((lst (list 5 4 3 2 1 0))) - (asize-of (the pair lst)) - ) - diff --git a/test/old_goal_tests/tests/test-pairp.gc b/test/old_goal_tests/tests/test-pairp.gc deleted file mode 100644 index 70730561c9..0000000000 --- a/test/old_goal_tests/tests/test-pairp.gc +++ /dev/null @@ -1,11 +0,0 @@ - ;-*-Scheme-*- - -(test-setup "test pass" #f) - -;; add two numbers in a function - -(expect-true (pair? '())) -(expect-false (pair? integer)) -(print "test pass") -(format #t "~%") - diff --git a/test/old_goal_tests/tests/test-print-binteger.gc b/test/old_goal_tests/tests/test-print-binteger.gc deleted file mode 100644 index 73032b4ea7..0000000000 --- a/test/old_goal_tests/tests/test-print-binteger.gc +++ /dev/null @@ -1,7 +0,0 @@ - ;-*-Scheme-*- - -;; add two constants together. -(test-setup -13 #f) -(printl (the binteger -13)) - - diff --git a/test/old_goal_tests/tests/test-protect.gc b/test/old_goal_tests/tests/test-protect.gc deleted file mode 100644 index 093e7a9873..0000000000 --- a/test/old_goal_tests/tests/test-protect.gc +++ /dev/null @@ -1,20 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 33 #f) - -(let ((var1 10) - (var2 20) - (sum 0) - ) - - (protect (var1 var2) - (set! var1 1) - (set! var2 2) - (+! sum var1) - (+! sum var2) - ) - (+! sum var1) - (+! sum var2) - sum - ) diff --git a/test/old_goal_tests/tests/test-qmemcpy-down.gc b/test/old_goal_tests/tests/test-qmemcpy-down.gc deleted file mode 100644 index c805d162db..0000000000 --- a/test/old_goal_tests/tests/test-qmemcpy-down.gc +++ /dev/null @@ -1,17 +0,0 @@ - ;-*-Scheme-*- - -;; add two constants together. -(test-setup 13 #f) - -(let* ((base-addr #x6000000) - (ptr-int32 (the (pointer int32) base-addr)) - (ptr-int16 (the (pointer int16) #x6000120)) - ) - (set! (-> ptr-int32 1) #x00070006) - (qmem-copy<-! ptr-int16 ptr-int32 8) - (+ (-> ptr-int16 2) - (-> ptr-int16 3) - ) - ) - - diff --git a/test/old_goal_tests/tests/test-qmemcpy-up.gc b/test/old_goal_tests/tests/test-qmemcpy-up.gc deleted file mode 100644 index 4c7ae0537b..0000000000 --- a/test/old_goal_tests/tests/test-qmemcpy-up.gc +++ /dev/null @@ -1,17 +0,0 @@ - ;-*-Scheme-*- - -;; add two constants together. -(test-setup 5 #f) - -(let* ((base-addr #x6000000) - (ptr-int32 (the (pointer int32) base-addr)) - (ptr-int16 (the (pointer uint8) #x6000120)) - ) - (set! (-> ptr-int32 2) #x11031102) - (qmem-copy->! ptr-int16 ptr-int32 16) - (+ (-> ptr-int16 8) - (-> ptr-int16 10) - ) - ) - - diff --git a/test/old_goal_tests/tests/test-quote-symbol.gc b/test/old_goal_tests/tests/test-quote-symbol.gc deleted file mode 100644 index a370d01f76..0000000000 --- a/test/old_goal_tests/tests/test-quote-symbol.gc +++ /dev/null @@ -1,10 +0,0 @@ - ;-*-Scheme-*- - -;; a bit of a hack on how this one works, but I think it's ok for now. -(test-setup 'beans #f) - -(define my-sym 'apples) -(set! my-sym 'beans) -(printl my-sym) - - diff --git a/test/old_goal_tests/tests/test-ref.gc b/test/old_goal_tests/tests/test-ref.gc deleted file mode 100644 index e7ba49705e..0000000000 --- a/test/old_goal_tests/tests/test-ref.gc +++ /dev/null @@ -1,5 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 83 #f) - -(ref (list 1 23 5 83 4) 3) diff --git a/test/old_goal_tests/tests/test-return-integer.gc b/test/old_goal_tests/tests/test-return-integer.gc deleted file mode 100644 index c40bd19adb..0000000000 --- a/test/old_goal_tests/tests/test-return-integer.gc +++ /dev/null @@ -1,13 +0,0 @@ - ;-*-Scheme-*- - - -;; needs reset because it is the first test - -; test a 64-bit integer. -(test-setup #x123456789 #t) -(test-result #x123456789) - -; result is (same as gcc and clang exactly!) -; 0: 48 b8 89 67 45 23 01 movabs rax,0x123456789 -; 7: 00 00 00 -; a: c3 ret \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-return-integer1.gc b/test/old_goal_tests/tests/test-return-integer1.gc deleted file mode 100644 index e3a2023b8e..0000000000 --- a/test/old_goal_tests/tests/test-return-integer1.gc +++ /dev/null @@ -1,8 +0,0 @@ -; return something that fits in u32 and s32 - -(test-setup #x17 #f) -(test-result #x17) - -; result is (same as gcc and clang exactly) -; 0: b8 17 00 00 00 mov eax,0x17 -; 5: c3 ret \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-return-integer2.gc b/test/old_goal_tests/tests/test-return-integer2.gc deleted file mode 100644 index 2005d24445..0000000000 --- a/test/old_goal_tests/tests/test-return-integer2.gc +++ /dev/null @@ -1,8 +0,0 @@ -; return something that fits in u32 and but not s32 - -(test-setup #xaaaaaaaa #f) -(test-result #xaaaaaaaa) - -; result, matches gcc/clang exactly -; 0: b8 aa aa aa aa mov eax,0xaaaaaaaa -; 5: c3 ret \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-return-integer3.gc b/test/old_goal_tests/tests/test-return-integer3.gc deleted file mode 100644 index 0517ad2ca6..0000000000 --- a/test/old_goal_tests/tests/test-return-integer3.gc +++ /dev/null @@ -1,8 +0,0 @@ -; return something negative that fits in s32 - -(test-setup -17 #f) -(test-result -17) - -; matches clang/gcc exactly -; 0: 48 c7 c0 ef ff ff ff mov rax,0xffffffffffffffef -; 7: c3 ret \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-return-integer4.gc b/test/old_goal_tests/tests/test-return-integer4.gc deleted file mode 100644 index 3db2b1032d..0000000000 --- a/test/old_goal_tests/tests/test-return-integer4.gc +++ /dev/null @@ -1,8 +0,0 @@ -; return something negative that does fit in s32 - -(test-setup -2147483648 #f) -(test-result -2147483648) - -; result, exactly matches gcc/clang -; 0: 48 c7 c0 00 00 00 80 mov rax,0xffffffff80000000 -; 7: c3 ret \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-return-integer5.gc b/test/old_goal_tests/tests/test-return-integer5.gc deleted file mode 100644 index a43aea0609..0000000000 --- a/test/old_goal_tests/tests/test-return-integer5.gc +++ /dev/null @@ -1,7 +0,0 @@ -(test-setup -2147483649 #f) -(test-result -2147483649) - -; result, exactly matches gcc/clang -; 0: 48 b8 ff ff ff 7f ff movabs rax,0xffffffff7fffffff -; 7: ff ff ff -; a: c3 ret \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-return-integer6.gc b/test/old_goal_tests/tests/test-return-integer6.gc deleted file mode 100644 index 67f5e788dc..0000000000 --- a/test/old_goal_tests/tests/test-return-integer6.gc +++ /dev/null @@ -1,7 +0,0 @@ -(test-setup 0 #f) -(test-result 0) - -; Result, exactly matches gcc/clang: -; beautiful 3-byte function! -; 0: 31 c0 xor eax,eax -; 2: c3 ret \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-return-negative-integer.gc b/test/old_goal_tests/tests/test-return-negative-integer.gc deleted file mode 100644 index 07831a5ac8..0000000000 --- a/test/old_goal_tests/tests/test-return-negative-integer.gc +++ /dev/null @@ -1,5 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup -123 #f) -(test-result -123) diff --git a/test/old_goal_tests/tests/test-set-symbol.gc b/test/old_goal_tests/tests/test-set-symbol.gc deleted file mode 100644 index bfa9249340..0000000000 --- a/test/old_goal_tests/tests/test-set-symbol.gc +++ /dev/null @@ -1,21 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 22 #f) - -(defun burp ((thing integer)) - (* thing 3) - ) - -(define thing 2) - -(set! thing 3) - - -(+ (let ((thing 4)) - (set! thing (+ thing 1)) - thing - ) - (burp thing) - (set! thing 4) - thing - ) diff --git a/test/old_goal_tests/tests/test-shiftvs.gc b/test/old_goal_tests/tests/test-shiftvs.gc deleted file mode 100644 index 1fa2faab45..0000000000 --- a/test/old_goal_tests/tests/test-shiftvs.gc +++ /dev/null @@ -1,7 +0,0 @@ - ;-*-Scheme-*- - - -(test-setup 11 #f) - -(+ (shlv 2 3) (shlv 1 0) (shlv 0 4) (shrv 2 3) (shrv 10 2) (shlv -2 1) (sarv -16 2)) -;; 16 1 0 0 2 -4 -4 diff --git a/test/old_goal_tests/tests/test-simple-function-call.gc b/test/old_goal_tests/tests/test-simple-function-call.gc deleted file mode 100644 index 0812206568..0000000000 --- a/test/old_goal_tests/tests/test-simple-function-call.gc +++ /dev/null @@ -1,8 +0,0 @@ - ;-*-Scheme-*- - -;; this math will be evaluted in goos -(test-setup (+ 1 (* 2 2) (* 3 3) (* 4 4)) #f) - -;; this relies on the c kernel having this test-function defined. - -(test-result (test-function 1 2 3 4)) diff --git a/test/old_goal_tests/tests/test-sort.gc b/test/old_goal_tests/tests/test-sort.gc deleted file mode 100644 index c75edbcb43..0000000000 --- a/test/old_goal_tests/tests/test-sort.gc +++ /dev/null @@ -1,12 +0,0 @@ -(test-setup '(2 3 4 7 9) #f) - - - -(let ((my-list - (list 24 16 32 56 72) - )) - (sort my-list (lambda ((x integer) (y integer)) (- x y))) - ;;(sort my-list (lambda (x y) (<= x y))) - (format #t "~A~%" my-list) - ) - diff --git a/test/old_goal_tests/tests/test-static-new-integer-field.gc b/test/old_goal_tests/tests/test-static-new-integer-field.gc deleted file mode 100644 index a95b568227..0000000000 --- a/test/old_goal_tests/tests/test-static-new-integer-field.gc +++ /dev/null @@ -1,12 +0,0 @@ -(test-setup 213 #f) - -(deftype test-static-type (basic) - ((pad int32) - (value int16) - ) - ) - -(let ((new-obj (new 'static 'test-static-type :value 213))) - (expect-true (= test-static-type (-> new-obj type))) - (-> new-obj value) - ) \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-string-constant-1.gc b/test/old_goal_tests/tests/test-string-constant-1.gc deleted file mode 100644 index 2ca1591fd3..0000000000 --- a/test/old_goal_tests/tests/test-string-constant-1.gc +++ /dev/null @@ -1,11 +0,0 @@ - ;-*-Scheme-*- - -;; this is just a "does it crash?" test, and doesn't actually verify the strings are correct. -;; but this is all we have for now -(test-setup 'automatic-pass #f) - -(inspect "this is a string") -(define x "this is also a string") -(inspect x) - -(test-result 1) diff --git a/test/old_goal_tests/tests/test-string-constant-2.gc b/test/old_goal_tests/tests/test-string-constant-2.gc deleted file mode 100644 index cabecdebfc..0000000000 --- a/test/old_goal_tests/tests/test-string-constant-2.gc +++ /dev/null @@ -1,8 +0,0 @@ - ;-*-Scheme-*- - -;; a bit of a hack on how this one works, but I think it's ok for now. -(test-setup "this is a string" #f) - -(print "this is a string") - - diff --git a/test/old_goal_tests/tests/test-string-type.gc b/test/old_goal_tests/tests/test-string-type.gc deleted file mode 100644 index 7d586d57e8..0000000000 --- a/test/old_goal_tests/tests/test-string-type.gc +++ /dev/null @@ -1,15 +0,0 @@ -(test-setup "tfs" #f) - -(expect-true (= 101 (-> "test" data 1))) -(expect-true (= 4 (-> "test" allocated-length))) -(expect-true (= 13 (asize-of "test"))) - -(let ((temp "test")) - (set! (-> temp data 1) 102) - (set! (-> temp data 3) 0) - (expect-true (= 3 (length temp))) - (format #t "~A~%" temp) - - ) - -1 \ No newline at end of file diff --git a/test/old_goal_tests/tests/test-sub-1.gc b/test/old_goal_tests/tests/test-sub-1.gc deleted file mode 100644 index 611f3ea25b..0000000000 --- a/test/old_goal_tests/tests/test-sub-1.gc +++ /dev/null @@ -1,22 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 4 #f) - -(defun negative ((a integer)) - (- a) - ) - -(defun minus-two ((a integer)) - (- a 2) - ) - - -(defun sub-test ((a integer) (b integer)) - (- 1 a b) - ) - -(let ((x (sub-test 1 (minus-two 7)))) - (- 1 x (- -2)) - ) - - diff --git a/test/old_goal_tests/tests/test-sub-2.gc b/test/old_goal_tests/tests/test-sub-2.gc deleted file mode 100644 index 0f93e6b3fb..0000000000 --- a/test/old_goal_tests/tests/test-sub-2.gc +++ /dev/null @@ -1,23 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 4 #f) - -(defun negative ((a integer)) - (- a) - ) - -(defun minus-two ((a integer)) - (- a 2) - ) - - -(defun sub-test ((a integer) (b integer)) - (- 1 a b) - ) - -(let ((x (sub-test 1 (minus-two 7)))) - (- 1 (negative -2) x) - ) - - - diff --git a/test/old_goal_tests/tests/test-three-reg-add.gc b/test/old_goal_tests/tests/test-three-reg-add.gc deleted file mode 100644 index 80c471ca57..0000000000 --- a/test/old_goal_tests/tests/test-three-reg-add.gc +++ /dev/null @@ -1,14 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 7 #f) - -;; this will terribly crash things if the coloring goes wrong. -(rlet ((x :reg rsp :type int32)) - (+ x 3) - ) - -(let ((x 3)) - (+ (+ x 1) x) - ) - - diff --git a/test/old_goal_tests/tests/test-three-reg-mult.gc b/test/old_goal_tests/tests/test-three-reg-mult.gc deleted file mode 100644 index a43c355d5b..0000000000 --- a/test/old_goal_tests/tests/test-three-reg-mult.gc +++ /dev/null @@ -1,11 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 3 #f) - -(let ((x 3)) - (* x 4) - (* x) - x - ) - - diff --git a/test/old_goal_tests/tests/test-three-reg-sub.gc b/test/old_goal_tests/tests/test-three-reg-sub.gc deleted file mode 100644 index ade946dba0..0000000000 --- a/test/old_goal_tests/tests/test-three-reg-sub.gc +++ /dev/null @@ -1,11 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 3 #f) - -(let ((x 3)) - (- x 1) - (- x) - x - ) - - diff --git a/test/old_goal_tests/tests/test-with-inline.gc b/test/old_goal_tests/tests/test-with-inline.gc deleted file mode 100644 index 400395e852..0000000000 --- a/test/old_goal_tests/tests/test-with-inline.gc +++ /dev/null @@ -1,26 +0,0 @@ - ;-*-Scheme-*- - -(test-setup 20 #f) - -(defglobalconstant constant 3) - -(defun inline-test-3 ((x integer)) - (declare (allow-inline)) - (* constant x) - ) - - -(let ((old-value (inline-test-3 2))) ;; 6 - (with-inline #t - (defglobalconstant constant 4) - (let ((second-value (inline-test-3 2))) ;; 8 - (with-inline #f - (+ old-value second-value (inline-test-3 2)) ;; 6 - ;;(inline-test-3 2) - ) - ) - ) - ) - -;; 6 good -;; 8 good diff --git a/test/test_compiler_and_runtime.cpp b/test/test_compiler_and_runtime.cpp index 164809396d..26f35b5970 100644 --- a/test/test_compiler_and_runtime.cpp +++ b/test/test_compiler_and_runtime.cpp @@ -10,27 +10,6 @@ TEST(CompilerAndRuntime, ConstructCompiler) { Compiler compiler; } -TEST(CompilerAndRuntime, StartRuntime) { - std::thread runtime_thread([]() { exec_runtime(0, nullptr); }); - - listener::Listener listener; - while (!listener.is_connected()) { - listener.connect_to_target(); - std::this_thread::sleep_for(std::chrono::microseconds(1000)); - } - - listener.send_reset(true); - runtime_thread.join(); -} - -TEST(CompilerAndRuntime, SendProgram) { - std::thread runtime_thread([]() { exec_runtime(0, nullptr); }); - Compiler compiler; - compiler.run_test("goal_src/test/test-return-integer-1.gc"); - compiler.shutdown_target(); - runtime_thread.join(); -} - namespace { std::string escaped_string(const std::string& in) { std::string result; @@ -111,14 +90,49 @@ struct CompilerTestRunner { } }; +std::vector get_test_pass_string(const std::string& name, int n_tests) { + return {fmt::format("Test \"{}\": {} Passes\n0\n", name, n_tests)}; +} + +void runtime_no_kernel() { + constexpr int argc = 4; + const char* argv[argc] = {"", "-fakeiso", "-debug", "-nokernel"}; + exec_runtime(argc, const_cast(argv)); +} + +void runtime_with_kernel() { + constexpr int argc = 3; + const char* argv[argc] = {"", "-fakeiso", "-debug"}; + exec_runtime(argc, const_cast(argv)); +} } // namespace +TEST(CompilerAndRuntime, StartRuntime) { + std::thread runtime_thread(runtime_no_kernel); + + listener::Listener listener; + while (!listener.is_connected()) { + listener.connect_to_target(); + std::this_thread::sleep_for(std::chrono::microseconds(1000)); + } + + listener.send_reset(true); + runtime_thread.join(); +} + +TEST(CompilerAndRuntime, SendProgram) { + std::thread runtime_thread(runtime_no_kernel); + Compiler compiler; + compiler.run_test("goal_src/test/test-return-integer-1.gc"); + compiler.shutdown_target(); + runtime_thread.join(); +} + TEST(CompilerAndRuntime, BuildGameAndTest) { - std::thread runtime_thread([]() { exec_runtime(0, nullptr); }); Compiler compiler; try { - compiler.run_test("goal_src/test/test-build-game.gc"); + compiler.run_test_no_load("goal_src/test/test-build-game.gc"); } catch (std::exception& e) { fprintf(stderr, "caught exception %s\n", e.what()); EXPECT_TRUE(false); @@ -127,8 +141,50 @@ TEST(CompilerAndRuntime, BuildGameAndTest) { // todo, tests after loading the game. CompilerTestRunner runner; runner.c = &compiler; - + std::thread runtime_thread(runtime_with_kernel); runner.run_test("test-min-max.gc", {"10\n"}); + runner.run_test("test-bfloat.gc", {"data 1.2330 print 1.2330 type bfloat\n0\n"}); + runner.run_test("test-basic-type-check.gc", {"#f#t#t#f#t#f#t#t\n0\n"}); + runner.run_test("test-condition-boolean.gc", {"4\n"}); + runner.run_test("test-type-type.gc", {"#t#f\n0\n"}); + runner.run_test("test-access-inline-array.gc", {"1.2345\n0\n"}); + runner.run_test("test-find-parent-method.gc", {"\"test pass!\"\n0\n"}); + runner.run_test("test-ref.gc", {"83\n"}); + runner.run_test("test-pair-asize.gc", {"8\n"}); + runner.run_test("test-last.gc", {"d\n0\n"}); + runner.run_test("test-sort.gc", + {"(24 16 32 56 72 1234 -34 25 654)\n(1234 654 72 56 32 25 24 16 -34)\n0\n"}); + runner.run_test("test-sort-2.gc", + {"(24 16 32 56 72 1234 -34 25 654)\n(-34 16 24 25 32 56 72 654 1234)\n0\n"}); + runner.run_test("test-sort-3.gc", + {"(24 16 32 56 72 1234 -34 25 654)\n(-34 16 24 25 32 56 72 654 1234)\n0\n"}); + runner.run_test("test-pair-length.gc", {"6\n"}); + runner.run_test("test-member-1.gc", {"(c d)\n0\n"}); + runner.run_test("test-member-2.gc", {"#f\n0\n"}); + runner.run_test("test-assoc-1.gc", {"w\n0\n"}); + runner.run_test("test-assoc-2.gc", {"#f\n0\n"}); + runner.run_test("test-assoce-1.gc", {"x\n0\n"}); + runner.run_test("test-assoce-2.gc", {"x\n0\n"}); + runner.run_test("test-append.gc", {"(a b c d e)\n0\n"}); + runner.run_test("test-delete-list.gc", {"(a b d e)\n0\n"}); + runner.run_test("test-delete-car.gc", {"((a . b) (e . f))\n#f\n0\n"}); + runner.run_test("test-insert-cons.gc", {"((c . w) (a . b) (e . f))\n0\n"}); + runner.run_test("test-new-inline-array-class.gc", {"2820\n"}); + runner.run_test("test-memcpy.gc", {"13\n"}); + runner.run_test("test-memset.gc", {"11\n"}); + runner.run_test("test-binteger-print.gc", {"-17\n0\n"}); + runner.run_test("test-tests.gc", {"Test Failed On Test 0: \"unknown\"\nTest Failed On Test 0: " + "\"test\"\nTest \"test-of-test\": 1 Passes\n0\n"}); + runner.run_test("test-type-arrays.gc", {"Test \"test-type-arrays\": 3 Passes\n0\n"}); + runner.run_test("test-number-comparison.gc", {"Test \"number-comparison\": 14 Passes\n0\n"}); + runner.run_test("test-approx-pi.gc", get_test_pass_string("approx-pi", 4)); + runner.run_test("test-dynamic-type.gc", get_test_pass_string("dynamic-type", 4)); + runner.run_test("test-string-type.gc", get_test_pass_string("string-type", 4)); + runner.run_test("test-new-string.gc", get_test_pass_string("new-string", 5)); + runner.run_test("test-addr-of.gc", get_test_pass_string("addr-of", 2)); + runner.run_test("test-set-self.gc", {"#t\n0\n"}); + + runner.print_summary(); compiler.shutdown_target(); runtime_thread.join(); @@ -177,7 +233,7 @@ TEST(CompilerAndRuntime, AllowInline) { } TEST(CompilerAndRuntime, CompilerTests) { - std::thread runtime_thread([]() { exec_runtime(0, nullptr); }); + std::thread runtime_thread(runtime_no_kernel); Compiler compiler; CompilerTestRunner runner; runner.c = &compiler; @@ -283,6 +339,23 @@ TEST(CompilerAndRuntime, CompilerTests) { runner.run_test("test-nested-float-functions.gc", {"i 1.4400 3.4000\nr 10.1523\ni 1.2000 10.1523\nr 17.5432\n17.543 10.152\n0\n"}); runner.run_test("test-deref-simple.gc", {"structure\n0\n"}); + runner.run_test("test-align16-1.gc", {"80\n"}); + runner.run_test("test-align16-2.gc", {"64\n"}); + runner.run_test("test-return-from-f.gc", {"77\n"}); + runner.run_test("test-return-from-f-tricky-color.gc", {"77\n"}); + runner.run_test("test-signed-int-compare.gc", {"12\n"}); + runner.run_test("test-return-value-of-if.gc", {"123\n"}); + runner.run_test("test-inline-array-field.gc", {"16\n"}); + runner.run_test("test-empty-pair.gc", {"()\n0\n"}); + runner.run_test("test-pair-check.gc", {"#t#f\n0\n"}); + runner.run_test("test-cons.gc", {"(a . b)\n0\n"}); + runner.run_test("test-list.gc", {"(a b c d)\n0\n"}); + runner.run_test("test-car-cdr-get.gc", {"ab\n0\n"}); + runner.run_test("test-car-cdr-set.gc", {"(c . d)\n0\n"}); + runner.run_test("test-nested-car-cdr-set.gc", {"efgh\n((e . g) f . h)\n0\n"}); + runner.run_test("test-dotimes.gc", {"4950\n"}); + runner.run_test("test-methods.gc", {"#t#t\n0\n"}); + runner.run_test("test-pointers-1.gc", {"13\n"}); compiler.shutdown_target(); runtime_thread.join(); diff --git a/test/test_goos.cpp b/test/test_goos.cpp index d723fae816..7b5216179a 100644 --- a/test/test_goos.cpp +++ b/test/test_goos.cpp @@ -1290,3 +1290,13 @@ TEST(GoosSpecialForms, And) { EXPECT_ANY_THROW(e(i, x)); } } + +TEST(GoosBuiltins, Format) { + Interpreter i; + EXPECT_EQ(e(i, "(fmt #f \"{}, {}, {}\" 3 'bean \"str\")"), "\"3, bean, str\""); +} + +TEST(GoosBuiltins, Error) { + Interpreter i; + EXPECT_ANY_THROW(e(i, "(error \"hi\")")); +} \ No newline at end of file diff --git a/third-party/fmt/format.h b/third-party/fmt/format.h index 17509b7b45..39e8e106e6 100644 --- a/third-party/fmt/format.h +++ b/third-party/fmt/format.h @@ -1598,9 +1598,10 @@ template struct int_writer { make_checked(p, s.size())); } if (prefix_size != 0) p[-1] = static_cast('-'); - using iterator = remove_reference_t; + // NOTE - modified as part of jak-project to avoid compiler warning about shadowing + using iterator_ = remove_reference_t; auto data = buffer.data(); - out = write_padded(out, specs, size, size, [=](iterator it) { + out = write_padded(out, specs, size, size, [=](iterator_ it) { return copy_str(data, data + size, it); }); }